повысить регулярное выражение без собственнических квантификаторов - PullRequest
0 голосов
/ 12 апреля 2011

Есть ли подобный способ написать это регулярное выражение без использования притяжательных квантификаторов (т. Е. ++ и * +?

boost::regex testing123("\"value\":\"((?:[^\\\"\\\\]++|\\\\.)*+)\"");

Я думаю, что это сопоставимо (?):

boost::regex testing123("\"value\":\"(?>(?:(?>[^\\\"\\\\]+)|\\\\.)*)\"");

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

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Притяжательные кванторы являются просто синтаксическим сахаром для атомарной группировки, то есть (ab)*+ эквивалентно (?>(ab)*).Используя это, вы можете переписать все ваше выражение без использования собственнических квантификаторов.

1 голос
/ 12 апреля 2011

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

"value":"([^\"]|\.)*"

Что это, по сути, говорит:

  • Матч "value":" (легкая часть)
  • Совпадение ноль или более:
    • Все, кроме \ или ", ИЛИ
    • Совпадение \, за которым следует ноль или более \, за которыми следует любой не \ символ.
  • Завершить регулярное выражение при совпадении с финалом "

Это допускает любую escape-последовательность и предполагает, что обратная косая черта всегда различает escape-последовательность (это означает, что \\" не является экранированной кавычкой, а скорее экранированной \, за которой следует завершающая цитата).

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

boost::regex testing123("\"value\":\"([^\\\"]|\\.)*\"");

Всегда старайтесь, чтобы регулярные выражения были простыми.

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