Ниже представлено регулярное выражение PHP, предназначенное для сопоставления (многострочных) строк внутри PHP или исходного кода JavaScript (из этого сообщения ), но я подозреваю, что у него есть проблемы. Что такое буквальный эквивалент Python (или PERL)?
~'(\\.|[^'])*'|"(\\.|[^"])*"~s
re.compile(..., re.DOTALL) \\. ? Это уменьшает . ? Нужно ли двойным обратным слэшам избегать его дважды в PHP? позволяя в каждой позиции совпадение либо \\. или [^'] (любой символ без кавычек) кажется полным излишеством для меня, может быть, объясняет, почему это регулярное выражение этого человека взрывается. Группа [^'] уже не соответствует всему этому . с модификатором s, конечно, он должен соответствовать символам новой строки?
для построения двух версий регулярного выражения с одиночными и двойными кавычками в Python можно использовать этот двухэтапный подход
NB более простая версия этого регулярного выражения также может быть найдена в этом списке примеров регулярных выражений PHP, в разделе Программирование: String .
Регулярное выражение в основном хорошо, за исключением того, что оно не обрабатывает экранированные кавычки (т. Е. \" И \' ). Это достаточно легко исправить:
'(?:\\.|[^'\\]+)*'|"(?:\\.|[^"\\]+)*"
Это «общее» регулярное выражение; в Python вы обычно пишете его в виде необработанной строки:
r"""'(?:\\.|[^'\\]+)*'|"(?:\\.|[^"\\]+)*""""
В PHP вам нужно избежать обратных косых черт, чтобы получить их после обработки строк PHP:
'~\'(?:\\\\.|[^\'\\\\]+)*\'|"(?:\\\\.|[^"\\\\]+)*"~s'
Большинство популярных в настоящее время языков имеют либо строковый тип, который требует меньше экранирования, поддержка регулярных выражений, так и и то, и другое. Вот как ваше регулярное выражение будет выглядеть как строка строки C #:
@"'(?:\\.|[^'\\]+)*'|""(?:\\.|[^""\\]+)*"""
Но, учитывая соображения форматирования, само регулярное выражение должно работать в любом ароматизированном Perl (и многих других вкусах).
ps: Обратите внимание, как я добавил квант + к вашим классам символов. Ваша интуиция о совпадении одного персонажа за раз правильна; добавление + делает огромную разницу в производительности. Но не позволяйте этому обмануть вас; когда вы имеете дело с регулярными выражениями, интуиция кажется неправильной чаще, чем нет. : /
\\. предназначен для соответствия буквальной обратной косой черты в шаблоне и проглатывания следующего символа. Обратите внимание: поскольку шаблоны в PHP (и Python) содержатся в строках, на самом деле это должно быть \\\\. в строке, так что она заканчивается как \\. в регулярном выражении.
Важно сопоставить обратную косую черту и проглотить следующий символ, потому что его можно использовать для избежания цитаты, которая в противном случае закончила бы матч преждевременно.
Этот шаблон выглядит так, как будто он должен работать нормально, и я не могу придумать более сжатый способ его выразить.
Он также должен хорошо работать в Python (как вы говорите, с re.DOTALL). В Python вы можете использовать нотную строчную нотацию, чтобы сохранить дополнительное экранирование обратной косой черты, хотя вам все равно нужно избегать одиночной кавычки. Это должно быть эквивалентно:
re.search(r'\'(\\.|[^\'])*\'|"(\\.|[^"])*"', str, re.DOTALL)