Это зависит от языка, но должен быть модификатор, который можно добавить к regex шаблону. В PHP это:
/(.*)<FooBar>/s
s в конце заставляет точку соответствовать весь символы включая новые строки.
обычно. не соответствует новым строкам, так попытка ((.|\n)*)<foobar>
В контексте использования в языках регулярные выражения действуют на строки, не строки. Таким образом, необходимо быть в состоянии использовать regex обычно, предполагая, что входная строка имеет несколько строк.
В этом случае, данный regex будет соответствовать всей строке, с тех пор "< FooBar>"; присутствует. В зависимости от специфических особенностей regex реализации, значение за 1$ (полученный из" (.*)"), или будет "fghij" или "abcde\nfghij". Как другие сказали, некоторые реализации позволяют Вам управлять ли "." соответствие желания новая строка, давая Вам выбор.
Основанное на строке использование регулярного выражения обычно для вещей командной строки как egrep.
Обратите внимание, что (.|\n)*
может быть менее эффективным, чем (например) [\s\S]*
(если regexes Вашего языка поддерживают такие Escape), и, чем нахождение, как определить модификатор, который делает. также соответствуйте новым строкам. Или можно пойти с альтернативами POSIXy как [[:space:][:^space:]]*
.
"."
обычно не соответствует разрывам строки. Большинство regex механизмов позволяет Вам добавлять S
- флаг (также названный DOTALL
и SINGLELINE
) для создания "."
также новые строки соответствия. Если это перестало работать, Вы могли бы сделать что-то как [\S\s]
.
Попробуйте это:
((.|\n)*)<FooBar>
Это в основном говорит "любой символ или новую строку" повторенный нуль или больше раз.
/(.*)<FooBar>/s
s заставляет Точку (.) соответствовать возвратам каретки
Я имел ту же проблему и решил ее в, вероятно, не лучший способ, но она работает. Я заменил все разрывы строки, прежде чем я сделал свое реальное соответствие:
mystring= Regex.Replace(mystring, "\r\n", "")
Я управляю HTML, таким образом, разрывы строки действительно не имеют значения для меня в этом случае.
Я попробовал все предложения выше без удачи, я использую.Net 3.5 FYI
Обычно при поиске трех последовательных строк в Powershell это выглядит следующим образом:
$file = get-content file.txt -raw
$pattern = 'lineone\r\nlinetwo\r\nlinethree\r\n' # "windows" text
$pattern = 'lineone\nlinetwo\nlinethree\n' # "unix" text
$pattern = 'lineone\r?\nlinetwo\r?\nlinethree\r?\n' # both
$file -match $pattern
# output
True
Как ни странно, это будет текст UNIX в приглашении, но текст Windows в файле:
$pattern = 'lineone
linetwo
linethree
'
Вот способ распечатать окончания строк:
'lineone
linetwo
linethree
' -replace "`r",'\r' -replace "`n",'\n'
# output
lineone\nlinetwo\nlinethree\n
Один путь состоял бы в том, чтобы использовать s
флаг (точно так же, как принятый ответ):
/(.*)<FooBar>/s
второй путь состоял бы в том, чтобы использовать m
(многострочный) флаг и любой из следующих шаблонов:
/([\s\S]*)<FooBar>/m
или
/([\d\D]*)<FooBar>/m
или
/([\w\W]*)<FooBar>/m
jex.im визуализирует регулярные выражения:
Используйте RegexOptions.Singleline, это меняет значение . для включения новых строк
Regex.Replace(content, searchText, replaceText, RegexOptions.Singleline);