Я хочу создать RegEx, который находит строки, начинающиеся и заканчивающиеся одинарными или двойными кавычками.
Например, я могу сопоставить такой случай следующим образом:
String: "Hello World"
RegEx: /[\"\'][^\"\']+[\"\']/
Однако проблема возникает, когда кавычки появляются в самой строке, например:
String: "Hello" World"
Мы знаем, что приведенное выше выражение не будет работать.
Что я хочу сделать, так это иметь escape внутри самой строки, поскольку в любом случае это будет необходимо:
String: "Hello\" World"
Теперь я мог придумать длинное и сложное выражение с различными шаблонами в группе, один из них:
RegEx: /[\"\'][^\"\']+(\\\"|\\\')+[^\"\']+[\"\']/
Однако мне это кажется чрезмерным, и я думаю, что может быть более короткое и элегантное решение.
Предполагаемый синтаксис:
run arg1 "arg1" "arg3 with \"" "\"arg4" "arg\"\"5"
Как видите, кавычки на самом деле используются только для того, чтобы строка с пробелами считалась одной строкой. Не беспокойтесь о arg1
, я должен уметь сопоставлять аргументы без кавычек.
Я сделаю это проще, аргументы можно заключать только в двойные кавычки. Поэтому я убрал одинарные кавычки из требований этого вопроса.
Я изменил пример Руи Джаримбы:
/(?<=")(\\")*([^"]+((\\(\"))*[^"])+)((\\"")|")/
Теперь это довольно хорошо объясняет большинство случаев, однако есть один последний случай, который может победить это:
run -a "arg3 \" p2" "\"sa\"mple\"\\"
Второй аргумент заканчивается на \\"
, что в данном случае является обычным способом разрешить обратную косую черту в конце вложенной строки, к сожалению, регулярное выражение считает, что это экранированная кавычка, поскольку шаблон \"
все еще существует в конце шаблона.
first
иlast
? - person Peon   schedule 21.11.2012['"]([^'"]+((\\(\"|'))*[^'"])+)['"]
. Смотрите мой ответ ниже - person Rui Jarimba   schedule 21.11.2012