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