Строки, вероятно, разделены \r\n
в вашем файле. И \r
(возврат каретки), и \n
(перевод строки) считаются символами-разделителями строк в регулярных выражениях Java, и метасимвол .
не будет совпадать ни с одним из них. \s
будет соответствовать этим символам, поэтому он потребляет \r
, но оставляет .*
для соответствия \n
, что не удается. Ваш тестер, вероятно, использовал просто \n
для разделения строк, которые были использованы \s
.
Если я прав, изменение \s
на \s+
или [\r\n]+
должно заставить его работать. Это, вероятно, все, что вам нужно сделать в этом случае, но иногда вы должны соответствовать ровно одному разделителю строк, или, по крайней мере, отслеживать, сколько вы соответствуете. В этом случае вам необходимо регулярное выражение, которое точно соответствует одному из трех наиболее распространенных типов разделителей строк: \r\n
(Windows / DOS), \n
(Unix / Linus / OSX) и \r
(старые Mac). Любой из них подойдет:
\r\n|[\r\n]
\r\n|\n|\r
Обновление: Начиная с Java 8 у нас есть другая опция, \R
. Он соответствует любому разделителю строк, включая не только \r\n
, но и несколько других, как определено стандартом Unicode . Это эквивалентно этому:
\r\n|[\n\x0B\x0C\r\u0085\u2028\u2029]
Вот как вы можете его использовать:
(?im)^.*www.*\R.*Pig.*$
Опция i
делает его нечувствительным к регистру, а m
переводит его в многострочный режим, позволяя ^
и $
совпадать на границах строки.