如何将模式与可选的周围引号相匹配?

Jak*_*ake 13 regex repeat quotations surround

如何编写与可以包含引号的模式匹配的正则表达式,但如果匹配,则必须在开头和结尾具有匹配的引号?

"?(pattern)"?
Run Code Online (Sandbox Code Playgroud)

将无法工作,因为它将允许以引号开头但不以一个结尾的模式.

"(pattern)"|(pattern)
Run Code Online (Sandbox Code Playgroud)

会工作,但重复.有没有更好的方法来做到这一点而不重复模式?

Dan*_*uis 19

您可以通过使用反向引用条件来获得解决方案而无需重复:

/^(")?(pattern)(?(1)\1|)$/
Run Code Online (Sandbox Code Playgroud)

火柴:

  • 图案
  • "图案"

不匹配:

  • "图案
  • 图案"

然而,这种模式有点复杂.它首先查找可选引用,如果找到,则将其置于反向引用1中.然后它搜索您的模式.然后它使用条件语法来说"如果再次找到反向引用1,匹配它,否则不匹配".整个模式被锚定(这意味着它需要单独出现在一条线上),以便不会捕获不匹配的引号(否则patternin pattern"将匹配).

请注意,对条件的支持因引擎而异,更加冗长但重复的表达式将得到更广泛的支持(并且可能更容易理解).


更新:这个正则表达式的一个更简单的版本将是/^(")?(pattern)\1$/,它不需要条件.当我最初测试时,我使用的测试仪给了我一个假阴性,这导致我打折它(哎呀!).

我将保留解决方案的条件性后代和兴趣,但这是一个更简单的版本,更有可能在更广泛的引擎中工作(反向引用是这里使用的唯一可能不受支持的功能).