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