emacs regex: захват текста внутри кавычек с экранированием - PullRequest
1 голос
/ 07 февраля 2011

Я использую это регулярное выражение для захвата текста между кавычками:

\"\\(.*?\\)\"

Как сделать так, чтобы он поддерживал экранирование с \ "?

Ответы [ 3 ]

3 голосов
/ 08 февраля 2011

Если вы работаете в Emacs, для работы с регулярными выражениями полезно использовать специальные инструменты Emacs. В частности, я рекомендую использовать re-builder для построения своего выражения в интерактивном режиме.

Но даже эти выражения становятся достаточно доступными только для записи; на них очень трудно смотреть через несколько дней или недель, и они понимают, что они имеют в виду, без отличной документации (например, sln предоставил выражение Perl).

Я склонен создавать все свои регулярные выражения в Emacs, используя макрос rx, который, как мне кажется, обеспечивает более читаемый код (хотя это может быть предметом споров). В вашем случае выражение будет выглядеть примерно так:

(rx "\"" (group (0+ (or (1+ (not (any "\"" "\\"))) (seq "\\" anything)))) "\"")

Если вы оцените это выражение в Emacs, оно выдаст:

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

Что само по себе было бы довольно сложно понять. На самом деле это то же самое выражение sln, которое было предложено выше, но оно используется для работы с Emacs.

1 голос
/ 07 февраля 2011

Вот регулярное выражение, которое сделает эту работу:

"\(\\[\\"]\|[^\\"]\)*"

Соответствует кавычкам, которые окружают любое число: а) кавычка или обратный слеш, которому предшествует обратный слеш, или б) любой символ, отличный от кавычек или обратного слеша.

В вашем вопросе не указано, что обратные слеши также должны быть экранированными, но мне кажется, что это разумное предположение. Если это не правильно, просто замените [\\"] на одну кавычку.

Обратите внимание, что если вы собираетесь поместить это выражение в строку, например, чтобы использовать его в коде на Лиспе, вам необходимо вставить обратную косую черту перед каждой кавычкой, а затем удвоить все остальные обратные слеши:

(setq my-quoted-string-regexp "\"\\(\\\\[\\\\\"]\\|[^\\\\\"]\\)*\"")
0 голосов
/ 07 февраля 2011

В Perl (с учетом emacs).Это самое быстрое регулярное выражение для этого ...
' " ( (?: [^"\\]+ | \\. )* ) " ' расширенный

или ' " ( ( [^"\\]+ | \\. )* ) " ' расширенный

или '"(([^"\\]+|\\.)*)"'

Если emacs избегает захватаgroups and dbl заключен в кавычки и не имеет GRPS без захвата, должен быть скорректирован.

Эквивалентная разбивка:

"                   # literal "
(                   # capture group 1
   (                   # capture group 2 (non-capture context)
       [^"\\]+            # Greedy captue of NOT " nor \ , 1 or more times
     |                       # OR ..
       \\.                # Any character preceded by a \  , 1 time
   )*                  # end group 2 , done 0 or more times
)                  # end group 1
"                  # literal "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...