Как сопоставить строки в двойных кавычках с экранированными символами в двойных кавычках? - PullRequest
31 голосов
/ 26 января 2009

Мне нужно регулярное выражение Perl, чтобы соответствовать строке. Я предполагаю только строки в двойных кавычках, что \ "является буквальным символом кавычки, а НЕ концом строки, и что \ \ является буквальным символом обратной косой черты и не должен экранировать символ кавычки. Если это не ясно, некоторые примеры:

"\""    # string is 1 character long, contains dobule quote
"\\"    # string is 1 character long, contains backslash
"\\\""  # string is 2 characters long, contains backslash and double quote
"\\\\"  # string is 2 characters long, contains two backslashes

Мне нужно регулярное выражение, которое может распознавать все 4 из этих возможностей и все другие простые вариации этих возможностей как допустимые строки. Теперь у меня есть:

/".*[^\\]"/

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

Ответы [ 7 ]

41 голосов
/ 27 января 2009

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

Это почти совпадает с ответом Кэла, но имеет преимущество в том, что сопоставляет строки, содержащие управляющие коды, такие как \n.

Символы ?: предназначены для предотвращения сохранения содержимого выражения в качестве обратной ссылки, но их можно удалить.

26 голосов
/ 26 января 2009

Как насчет этого?

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

соответствует нулю или более символов, которые не являются косыми чертами или кавычками ИЛИ двумя косыми чертами ИЛИ косой чертой, а затем кавычкой

9 голосов
/ 27 января 2009

Общее решение (соответствует всем символам с обратной косой чертой):

/ \A "               # Start of string and opening quote
  (?:                #  Start group
    [^\\"]           #   Anything but a backslash or a quote
    |                #  or
    \\.              #   Backslash and anything
  )*                 # End of group
  " \z               # Closing quote and end of string
  /xms
5 голосов
/ 27 января 2009

См. Текст :: Сбалансированный . Это лучше, чем изобретать велосипед. Используйте gen_delimited_pat, чтобы увидеть шаблон результата и изучить его.

1 голос
/ 11 января 2014

Вот очень простой способ:

/"(?:\\?.)*?"/

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

1 голос
/ 15 января 2010

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

use Regexp::Common;

my $str = '" this is a \" quoted string"';
if ($str =~ $RE{quoted}) {
  # do something
}
0 голосов
/ 18 января 2017

Попробуйте этот код: (\".+")

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