Как мне сопоставить шаблон с необязательными кавычками? - PullRequest
13 голосов
/ 25 августа 2010

Как можно написать регулярное выражение, которое соответствует шаблону, который может содержать кавычки, но если это так, должно иметь соответствующие кавычки в начале и конце?

"?(pattern)"?

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

"(pattern)"|(pattern)

Будет работать, но повторяется.Есть ли лучший способ сделать это, не повторяя шаблон?

Ответы [ 3 ]

18 голосов
/ 25 августа 2010

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

/^(")?(pattern)(?(1)\1|)$/

Совпадения:

  • pattern
  • "pattern"

Не соответствует:

  • "pattern
  • pattern"

Однако эта схема несколько сложна.Сначала он ищет необязательную цитату и помещает ее в обратную ссылку 1, если она найдена.Затем он ищет ваш шаблон.Затем он использует условный синтаксис, чтобы сказать: «если обратная ссылка 1 найдена снова, сопоставьте ее, в противном случае ничего не сопоставьте».Весь шаблон является привязанным (что означает, что он должен появиться сам по себе в строке), так что не будут найдены несогласованные кавычки (в противном случае pattern в pattern" будет соответствовать).

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


Обновление: Aгораздо более простой версией этого регулярного выражения будет /^(")?(pattern)\1$/, что не требует условного выражения.Когда я тестировал это изначально, тестер, который я использовал, дал мне ложный отрицательный результат, который заставил меня обесценить его (упс!).

Я оставлю решение с условием для потомства и интереса,но это более простая версия, которая с большей вероятностью будет работать в самых разных движках (обратные ссылки - единственная функция, которая здесь используется, которая может не поддерживаться).

0 голосов
/ 25 августа 2010

Это должно работать с рекурсивным регулярным выражением (которое требует больше времени, чтобы получить право).А пока: в Perl вы можете создать самоизменяющееся регулярное выражение .Я оставлю это в качестве академического примера; -)

my @stuff = ( '"pattern"', 'pattern', 'pattern"', '"pattern'  );

foreach (@stuff) {
   print "$_ OK\n" if /^
                        (")?
                        \w+
                        (??{defined $1 ? '"' : ''})
                       $
                      /x
}

Результат:

"pattern" OK
pattern OK
0 голосов
/ 25 августа 2010

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

(["'])(pattern)\1|^(pattern)$

Таким образом, вы требуете, чтобы либо не было кавычек, либо чтобы ЖЕ цитата использовалась на обоих концах.

...