Регулярное выражение для сопоставления буквенных строк - PullRequest
1 голос
/ 17 октября 2011

Я пытаюсь написать регулярное выражение, которое будет соответствовать строке.Для простоты на данный момент меня интересуют только строки с двойными кавычками (").

Пока у меня есть это: "\"[^\"]*\""

Это работает для большинства строк, но не работает, когда естьэкранированная двойная кавычка, такая как:

"a string \" with an escaped quote"

В этом случае она соответствует только экранированной кавычке.

Я пробовал несколько вещей, чтобы разрешить экранированную кавычку, но покаЯ потерпел неудачу, кто-нибудь может мне помочь?

Ответы [ 6 ]

2 голосов
/ 17 октября 2011

Мне удалось решить это самостоятельно:

"\"(\\.|[^\"\\])*\""
1 голос
/ 17 октября 2011

Попробуйте это:

"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"

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

"[^"\\]*(?:\\.[^"\\]*)*"
0 голосов
/ 17 октября 2011

POSIX, AFAIK, не поддерживает обходные пути - без этого на самом деле не существует способа сделать это с помощью только регулярных выражений. Однако, согласно имеющемуся у меня эмулятору POSIX (нет доступа к собственной среде или библиотеке), в некоторых случаях это может приблизить вас:

"[^\"]*"|"[^\]*\\|\\[^\"]*[\"]

будет захватывать часть до и часть после экранированной кавычки ... с этой исходной строкой (игнорируйте разрывы строк, представьте, что все в одной строке):

I want to match "this text" and "This text, where there is an escaped 
slash (\\), and an \"escaped quote\" (\")", but I also want to handle\\ escaped
back-slashes, as in "this text, with a \\ backslash: \\" -- with a little
text behind it!

захватит эти группы:

"this text"                                          -- simple, quoted string
"This text, where there is an escaped slash (\       -- part 1 of quoted string
\), and an \                                         -- part 2
"escaped quote\                                      -- part 3
" (\                                                 -- part 4
")"                                                  -- part 5, and ends with a quote
\\                                                   -- not part of a quoted string
"this text, with a \                                 -- part 1 of quoted string
\ backslash: \                                       -- part 2
\"                                                   -- part 3, and ends with a quote

При дальнейшем анализе вы можете комбинировать их в зависимости от ситуации:

  • Если группа начинается и заканчивается символом ", то все в порядке
  • Если группа начинается с " и заканчивается \, то за ней следует НЕМЕДЛЕННО , за которой следует другая группа совпадений, которая либо заканчивается символом кавычки, либо рекурсивно продолжается НЕМЕДЛЕННО следовать за другой группой совпадений
  • Если группа не сразу следует за другим совпадением, она не является частью строки в кавычках

Я думаю, что это весь анализ, который вам нужен, но не забудьте проверить его !!!

Дайте мне знать, если эта идея поможет!

EDIT: Дополнительное примечание: просто для ясности, чтобы это работало, все кавычки во всей исходной строке должны быть экранированы, если они не должны использоваться в качестве разделителей, и обратные слеши также должны экранироваться везде

0 голосов
/ 17 октября 2011

Обычно вы хотите принять что-либо сбежавшее.

" [^"\\]* (?: \\. [^"\\]* )* " будет самым быстрым.

"[^"\\]*(?:\\.[^"\\]*)*" сжато.

0 голосов
/ 17 октября 2011

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

"\"[^\"]*(?<!\\)"

(?<!\\)" должно соответствовать ", это , а не , за которым следует \.

0 голосов
/ 17 октября 2011

Попробуйте:

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

Из Библиотека регулярных выражений .

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