Вы можете получить решение, не повторяя его, используя обратные ссылки и условные выражения:
/^(")?(pattern)(?(1)\1|)$/
Спички:
Не совпадает:
Однако этот образец несколько сложен. Сначала он ищет необязательную цитату и помещает ее в обратную ссылку 1, если она найдена. Затем он ищет ваш узор. Затем он использует условный синтаксис, чтобы сказать: «Если обратная ссылка 1 найдена снова, сопоставить ее, иначе ничего не сопоставить». Весь шаблон привязан (что означает, что он должен отображаться сам по себе в строке) так что несовпадающие кавычки не будут захвачены (иначе pattern
в pattern"
будет совпадать).
Обратите внимание, что поддержка условных выражений зависит от движка, и более подробные, но повторяющиеся выражения будут поддерживаться более широко (и, вероятно, их легче понять).
Обновление. Гораздо более простой версией этого регулярного выражения будет /^(")?(pattern)\1$/
, для которого не требуется условное выражение. Когда я тестировал это изначально, тестер, который я использовал, дал мне ложноотрицательный результат, из-за чего я отказался от него (ой!).
Я оставлю решение с условием для потомков и интереса, но это более простая версия, которая с большей вероятностью будет работать в более широком спектре движков (обратные ссылки - единственная функция, которая здесь используется, которая может не поддерживаться).
person
Daniel Vandersluis
schedule
25.08.2010