Как я соответствую какому-либо символу через несколько строк в регулярном выражении?

314
задан Bobulous 19 April 2015 в 10:59
поделиться

11 ответов

Это зависит от языка, но должен быть модификатор, который можно добавить к regex шаблону. В PHP это:

/(.*)<FooBar>/s

s в конце заставляет точку соответствовать весь символы включая новые строки.

222
ответ дан Jeremy Ruten 23 November 2019 в 01:06
поделиться

обычно. не соответствует новым строкам, так попытка ((.|\n)*)<foobar>

0
ответ дан tloach 23 November 2019 в 01:06
поделиться

В контексте использования в языках регулярные выражения действуют на строки, не строки. Таким образом, необходимо быть в состоянии использовать regex обычно, предполагая, что входная строка имеет несколько строк.

В этом случае, данный regex будет соответствовать всей строке, с тех пор "< FooBar>"; присутствует. В зависимости от специфических особенностей regex реализации, значение за 1$ (полученный из" (.*)"), или будет "fghij" или "abcde\nfghij". Как другие сказали, некоторые реализации позволяют Вам управлять ли "." соответствие желания новая строка, давая Вам выбор.

Основанное на строке использование регулярного выражения обычно для вещей командной строки как egrep.

1
ответ дан nsayer 23 November 2019 в 01:06
поделиться

Обратите внимание, что (.|\n)* может быть менее эффективным, чем (например) [\s\S]* (если regexes Вашего языка поддерживают такие Escape), и, чем нахождение, как определить модификатор, который делает. также соответствуйте новым строкам. Или можно пойти с альтернативами POSIXy как [[:space:][:^space:]]*.

3
ответ дан tye 23 November 2019 в 01:06
поделиться

"." обычно не соответствует разрывам строки. Большинство regex механизмов позволяет Вам добавлять S - флаг (также названный DOTALL и SINGLELINE) для создания "." также новые строки соответствия. Если это перестало работать, Вы могли бы сделать что-то как [\S\s].

8
ответ дан Markus Jarderot 23 November 2019 в 01:06
поделиться

Попробуйте это:

((.|\n)*)<FooBar>

Это в основном говорит "любой символ или новую строку" повторенный нуль или больше раз.

318
ответ дан levik 23 November 2019 в 01:06
поделиться
/(.*)<FooBar>/s

s заставляет Точку (.) соответствовать возвратам каретки

5
ответ дан Bill 23 November 2019 в 01:06
поделиться

Я имел ту же проблему и решил ее в, вероятно, не лучший способ, но она работает. Я заменил все разрывы строки, прежде чем я сделал свое реальное соответствие:

mystring= Regex.Replace(mystring, "\r\n", "")

Я управляю HTML, таким образом, разрывы строки действительно не имеют значения для меня в этом случае.

Я попробовал все предложения выше без удачи, я использую.Net 3.5 FYI

1
ответ дан Slee 23 November 2019 в 01:06
поделиться

Обычно при поиске трех последовательных строк в 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
0
ответ дан 23 November 2019 в 01:06
поделиться

Опция 1

Один путь состоял бы в том, чтобы использовать s флаг (точно так же, как принятый ответ):

/(.*)<FooBar>/s

Демонстрация 1

Опция 2

второй путь состоял бы в том, чтобы использовать m (многострочный) флаг и любой из следующих шаблонов:

/([\s\S]*)<FooBar>/m

или

/([\d\D]*)<FooBar>/m

или

/([\w\W]*)<FooBar>/m

Демонстрация 2

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

-1
ответ дан 23 November 2019 в 01:06
поделиться

Используйте RegexOptions.Singleline, это меняет значение . для включения новых строк

Regex.Replace(content, searchText, replaceText, RegexOptions.Singleline);

3
ответ дан 23 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: