У меня возникают некоторые проблемы с регулярным выражением, которое я создаю.
Мне нужно регулярное выражение для сопоставления с приведенными ниже примерами, а затем совпадение в первой цитируемой строке:
Строки ввода
("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ')
('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', 'arg1', "arg2")
Должен совпадать
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Regex пока:
\((["'])([^"']+)\1,?.*\)
Регулярное выражение выполняет совпадение текста между первым набором кавычек и возвращает вспомогательное соответствие, показанное выше.
Это почти отлично работает, но проблема заключается в том, что если строка с кавычками содержит кавычки в тексте, то совпадение останавливается в первом экземпляре, см. Ниже:
Неисправность входных строк
("Lorem ipsum dolor \"sit\" amet, consectetur adipiscing elit.")
Только вспомогательные спички: Lorem ipsum dolor
("Lorem ipsum dolor 'sit' amet, consectetur adipiscing elit.")
Весь матч терпит неудачу.
Заметки
Входные строки – это фактически вызовы функций кода php. Я пишу скрипт, который сканирует исходные файлы .php для конкретной функции и захватывает текст из первого параметра.
Попробуйте это регулярное выражение:
\(\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')(?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*\s*\)
Некоторое объяснение:
\(\s\*
соответствует открывающей скобке и необязательному пробелу. (?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')
соответствует любой кавычки, разрешающей котировку символа только при сбегании с \
. (?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*
описывает ноль или более строк кавычек, которым предшествует a ,
которому может предшествовать пробел. \s*\)
соответствует закрывающей скобке с дополнительным пробелом. убедитесь, что не совпадают с цитатой, когда она сбежала (перед ней обратная косая черта):
/\((["'])([^"']+)[^\\]\1,?.*?\)/