Regex для цитируемой речи - PullRequest
2 голосов
/ 06 ноября 2019

Я выдвинул следующее регулярное выражение, чтобы иметь возможность извлекать цитаты из текста:

"(?P<quote>.+?(?<![^\\]\\))"

С этим все работает нормально: https://regex101.com/r/NVjtW4/1.

Однако мне было интересноесли бы были какие-то другие «приемы», которые вы могли бы использовать для извлечения цитируемых текстов. Возможно, со следующими ограничениями:

  • Не используется .+?
  • Без использования отрицательного внешнего вида (возможно, вместо этого используется отрицательный класс символов).

В основномМой вопрос здесь не в том, «Каков единственный способ сделать это?», а в том, «Какие могут быть другие альтернативы», чтобы я мог видеть различные возможные подходы, чтобы решить, что для меня кажется трудным и хитрым регулярным выражением для создания\, но не два \\ и т. Д.)

Кроме того, я хочу проверить, не существует ли нечетного числа экранировок, предшествующих кавычке:

".*?(?<=(\\{2})*)"

Но этодает мне ошибку "* A quantifier inside a lookbehind makes it non-fixed width". Еще один, который у меня был:

"[^((\\{2})*")]+"

Но это также не соответствует экранированным кавычкам.

1 Ответ

3 голосов
/ 06 ноября 2019

Это может быть выполнено без использования ленивых квантификаторов и видоискателей:

Смотрите здесь регулярное выражение

"(?<quote>(?:[^"\\]|(?:\\["\\])*)*)"

Это работает следующим образом:

  • (?:[^"\\]|(?:\\["\\])* Соответствует любой из следующих опций любое количество раз
    • [^"\\] - Вариант 1: Соответствует любому символу, кроме \ или "
    • (?:\\["\\])*- Вариант 2: Матч \, за которым следует \ или ", любое количество раз
      • Это соответствует следующим случаям \\, \\\\, \\\\\\ и т. Д. И \", \\\", \\\\\" и т. Д.
      • Если вы хотите, чтобы оно также совпадало с такими случаями, как \a, измените \\["\\] на \\.

Проблема, с которой вы столкнулись с lookbehind (выдает ошибку "* A quantifier inside a lookbehind makes it non-fixed width"), заключается в том, что используемый вами механизм регулярных выражений не допускает переменные lookbehinds.

Некоторые движки регулярных выражений разрешают это (например, движок регулярных выражений для .NET), но большинство не поддерживают это (например, PCRE не поддерживает это). Чтобы обойти это, некоторые движки регулярных выражений позволяют использовать токен \K, который позволяет сбросить совпадение (?:\\{2})*\K

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...