6

Как сопоставить любой символ на нескольких строках в регулярном выражении?

1

Например, данное регулярное выражение:

(.*)<FooBar>

совпадает с текстом:

abcde<FooBar>

Но как сделать так, чтобы оно совпадало с текстом, который занимает несколько строк?

abcde
fghij<FooBar>

5 ответ(ов)

7

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

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

Это выражение в основном означает "любой символ или символ новой строки", повторяющийся произвольное количество раз.

3

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

/(.*)<FooBar>/s

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

0

Если вы используете поиск в Eclipse, вы можете включить опцию "DOTALL", чтобы знак . соответствовал любому символу, включая разделители строк. Для этого просто добавьте (?s) в начале вашей строки поиска. Например:

(?s).*<FooBar>
0

В регулярных выражениях точка (.) соответствует любому символу, кроме переносов строк (\r\n). Поэтому, чтобы соответствовать всем символам, включая переносы строк, следует использовать конструкцию \s\S, которая будет соответствовать ВСЕМ символам. Ваша регулярка будет выглядеть так:

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

Здесь ([\s\S]*) захватывает любые символы (включая переносы строк) перед тегом <FooBar>.

0

Мы также можем использовать следующий регекс:

(.*?\n)*?

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

Это сделает перенос строки необязательным:

(.*?|\n)*?

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь