Лучший способ распознать строку в кавычках - PullRequest
0 голосов
/ 25 августа 2018

Что такое регулярное выражение для соответствия следующему?

1 foo (строка без кавычек)

2 "foo" (строка внутри двойных кавычек)

3 'foo' (строка внутри одинарных кавычек)

4 "fo\"o" (строка с экранированной кавычкой)

5 'fo\'o' (строка с экранированной кавычкой)

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

[a-z]+|"[a-z]+"|'[a-z]+'

но это не учитывает случаи 4 и 5.

Мне кажется, что я могу решить эту проблему (с отрицанием, вложенными группами, выглядит некрасиво и медленно), но я не знаю, как сделать это элегантно.

1 Ответ

0 голосов
/ 25 августа 2018

Вот рабочее Regex:

^(\"(?:(?:\w|\\")+)\"|\'(?:(?:\w|\\')+)\'|\w+)$

См. Демонстрацию на Regex101 и прочтите описание.Сначала немного теории:

  • ^ - начало строки, а $ - конец
  • (?:) - группа без захвата и используютсяздесь только для определения повторения
  • | является или разделителем между частями группы.

Теперь само Regex:

  • \"(?:(?:\w|\\")+)\" - возможное совпадение "Foo" и "Fo\"o".
    • (?:\w|\\")+ обозначает хотя бы одно слово или экранированный символ ".
    • \" - окружающий символ
  • \'(?:(?:\w|\\')+)\' - то же самое, что и выше, но для ' соответствия символов 'Foo' и 'Fo\'o'.
  • \w+ обозначает любое слово

Вы можете понимать регулярное выражение как:

  • ^(match-with-double-quotations OR match-with-single-quotations OR match-a-word)$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...