ruby regex о побеге - PullRequest
       1

ruby regex о побеге

1 голос
/ 13 февраля 2012

Я пытаюсь написать регулярное выражение в Ruby для проверки строки, такой как:
"GET \"anything/here.txt\""

Суть в том, что все может быть во внешней двойной кавычке, но все двойные кавычки во внешних двойных кавычках должны быть экранированы обратной косой чертой (в противном случае она не совпадает). Так например
"GET "anything/here.txt""
это не будет правильной строкой.

Я пробовал много способов написать регулярное выражение, но делал работу. Кто-нибудь может мне с этим помочь? спасибо

Ответы [ 4 ]

5 голосов
/ 13 февраля 2012

Вы можете использовать положительный вид сзади:

/\A"((?<=\\)"|[^"])*"\z/

Это именно то, что вы просили: «если двойная кавычка появляется во внешних двойных кавычках без префикса обратной косой черты, она не't match. "

Некоторые комментарии:

\A, \z: Они совпадают только в начале и конце строка.Таким образом, шаблон должен соответствовать строке целом , а не ее части.(?<=): это синтаксис для позитивного взгляда сзади;он утверждает, что шаблон должен соответствовать непосредственно перед текущей позицией.Таким образом, (?<=\\)" соответствует «двойной кавычке, которой предшествует обратный слеш».[^"]: Это соответствует «любому символу, который не является обратной косой чертой».

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

Если ваша версия Ruby не имеет вид сзади, вы можете сделать что-то вроде:

/\A"(\\.|[^"\\])*"\z/

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

1 голос
/ 13 февраля 2012

Это работает:

/"(?<method>[A-Z]*)\s*\\\"(?<file>[^\\"]*)\\""/

Посмотреть на Рубуляр .

Редактировать:

"(?<method>[A-Z]*)\s(?<content>(\\\"|[a-z\/\.]*)*)"

Посмотреть здесь .

Редактировать 2: без (? ...) последовательности (для Ruby 1.8.6):

"([A-Z]*)\s((\\\"|[a-z\/\.]*)*)"

Рубулярный здесь .

0 голосов
/ 16 февраля 2012

Я не уверен, что регулярное выражение действительно ваш лучший инструмент, но если вы настаиваете на его использовании, я рекомендую рассматривать строку как последовательность токенов: цитата, а затем ряд вещей, которые либо*, \" или что-нибудь, что не является кавычкой, а затем закрывающей кавычкой в ​​конце.Итак, это:

^"(\\\\|\\"|[^"])*"$
0 голосов
/ 13 февраля 2012

Успешно протестировано на Rubular:

\"GET \\\".*\\\"\"

Разбивка:
\ "- Escape" для строки регулярного выражения, что означает буквальный символ "
GET - Предполагая, что вы просто хотите получить GET, чем это явно
\\ "- Escape \ и" получить буквальную строку \ "
. * - 0 или более символов, отличных от \ n
\\ "\" - Побег за буквальный \ ""

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