Получение текста между кавычками с использованием регулярного выражения - PullRequest
1 голос
/ 27 апреля 2010

У меня проблемы с созданным регулярным выражением.

Мне нужно регулярное выражение для сопоставления со следующими примерами, а затем под совпадение в первой строке в кавычках:

Входные строки

("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.

До сих пор регулярное выражение:

\((["'])([^"']+)\1,?.*\)

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

Это почти идеально работает, но у меня проблема в том, что если строка в кавычках содержит кавычки в тексте, то субсоответствие останавливается в первом случае, см. Ниже:

Ошибка ввода строк

("Lorem ipsum dolor \"sit\" amet, consectetur adipiscing elit.")

Только подстроки: Lorem ipsum dolor

("Lorem ipsum dolor 'sit' amet, consectetur adipiscing elit.")

Весь матч не удался.

Примечания

Входные строки на самом деле являются вызовами функций кода php. Я пишу скрипт, который будет сканировать исходные файлы .php для определенной функции и извлекать текст из первого параметра.

Ответы [ 2 ]

6 голосов
/ 27 апреля 2010

Попробуйте это регулярное выражение:

\(\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')(?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*\s*\)

Некоторые объяснения:

  • \(\s\* соответствует открывающей скобке и необязательным пробелам.
  • (?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*') соответствует любой строке в кавычках, допускающей использование символа кавычки только при экранировании с помощью \.
  • (?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))* описывает ноль или более строк в кавычках, перед которыми стоит ,, за которым может предшествовать пробел, а затем пробел.
  • \s*\) соответствует закрывающей скобке с необязательным пробелом.
0 голосов
/ 27 апреля 2010

убедитесь, что не совпадает с кавычкой при ее экранировании (перед ней стоит обратная косая черта):

/\((["'])([^"']+)[^\\]\1,?.*?\)/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...