Вы можете получить решение, не повторяя путем использования backreferences и conditionals:
/^(")?(pattern)(?(1)\1|)$/
Матчи:
не ли матч:
Этот шаблон является довольно сложным, однако. Сначала он ищет необязательную цитату и помещает ее в backreference 1, если ее можно найти. Затем он ищет ваш шаблон. Затем он использует условный синтаксис, чтобы сказать «если backreference 1 найден снова, сопоставьте его, иначе ничего не получится». Весь шаблон - anchored (что означает, что он должен появляться сам по себе на линии), так что непревзойденные кавычки не будут захвачены (в противном случае pattern
в pattern"
).
Обратите внимание, что поддержка условных обозначений зависит от двигателя, и более подробные, но повторяющиеся выражения будут более широко поддерживаться (и, вероятно, их легче понять).
Update: Намного проще вариант этого регулярное выражение будет /^(")?(pattern)\1$/
, который не нуждается в условна. Когда я тестировал это изначально, тестер, который я использовал, дал мне ложный отрицательный результат, который привел меня к скидке (oops!).
Я оставлю решение с условием для потомков и интересов, но это более простая версия, которая, скорее всего, будет работать в более широком спектре движков (обратные ссылки являются единственной функцией, используемой здесь, которая может быть неподдерживаемой).
Какой вкус регулярных выражений вы используете? .Net допускает такое «совпадение скобок», но другие ароматы этого не делают. – cristobalito
Связанное исследование: http://stackoverflow.com/questions/3165755/capturing-thispartonly-and-thispartonly-with-the-same-group – polygenelubricants