Как сопоставить любой символ на нескольких строках в регулярном выражении?
Например, данное регулярное выражение:
(.*)<FooBar>
совпадает с текстом:
abcde<FooBar>
Но как сделать так, чтобы оно совпадало с текстом, который занимает несколько строк?
abcde
fghij<FooBar>
5 ответ(ов)
Попробуйте это:
((.|\n)*)<FooBar>
Это выражение в основном означает "любой символ или символ новой строки", повторяющийся произвольное количество раз.
Это зависит от языка программирования, но обычно есть модификатор, который можно добавить к регулярному выражению. В PHP, например, это выглядит так:
/(.*)<FooBar>/s
s в конце указывает на то, что точка будет соответствовать всем символам, включая символы переноса строки.
Если вы используете поиск в Eclipse, вы можете включить опцию "DOTALL", чтобы знак .
соответствовал любому символу, включая разделители строк. Для этого просто добавьте (?s)
в начале вашей строки поиска. Например:
(?s).*<FooBar>
В регулярных выражениях точка (.) соответствует любому символу, кроме переносов строк (\r\n
). Поэтому, чтобы соответствовать всем символам, включая переносы строк, следует использовать конструкцию \s\S
, которая будет соответствовать ВСЕМ символам. Ваша регулярка будет выглядеть так:
([\s\S]*)<FooBar>
Здесь ([\s\S]*)
захватывает любые символы (включая переносы строк) перед тегом <FooBar>
.
Мы также можем использовать следующий регекс:
(.*?\n)*?
что позволит нам совпадать со всеми символами, включая переносы строк, без жадного захвата.
Это сделает перенос строки необязательным:
(.*?|\n)*?
В этом выражении будет производиться сопоставление как с любыми символами, так и с переносами строк, при этом захват не будет жадным, что позволяет избежать избыточного сопоставления.
Как изменить цвет вывода echo в Linux
Как присвоить многострочную строку переменной?
Как разделить строку с несколькими разделителями в JavaScript?
Экранирование строки для использования в регулярных выражениях JavaScript [duplicate]
Как передать переменные и данные из PHP в JavaScript?