在不复制表达式的情况下强制正则表达式用双引号引起来或根本不引起来

Enforcing a regex to be wrapped with quotation marks from both sides or not at all without duplicating the expression

我有一个表达式,要么用双引号括起来,要么根本不用,我想创建一个正则表达式来捕获这个表达式。
关键是,我不想重复这个表达式。
例如,如果表达式是任何单个英文字母,那么重复的正则表达式将为

^[a-z]|'[a-z]'$

现在 a'a' 都会被接受。

有没有办法在不复制表达式的情况下定义这个正则表达式?

怎么样:

^('?)[a-z]$

在第 1 组中,匹配 ' 或不匹配。在 [a-z] 部分之后,匹配我们在第 1 组中匹配的内容 (</code>)。所以要么:</p> <ul> <li>第 1 组匹配 <code>',在这种情况下 </code> 匹配 <code>' --> ^'[a-z]'$,或;

  • 第 1 组什么都不匹配,在这种情况下 </code> 什么都不匹配 --> <code>^[a-z]$
  • 因此,这与 ^([a-z]|'[a-z]')$..

    匹配相同的内容

    Demo

    this呢?

    ^(?:'|(?=.*[^']$))[a-z]'?$
    

    实际上这是错误的,因为它也匹配 'aThis 更好,但也更长一些:

    ^(?:'(?=.*')|(?=[^']+$))[a-z]'?$
    

    第二个工作版本的解释:

    • [a-z]'?$ 匹配行尾可选地后跟 ' 的字母。这个单引号是否存在取决于正则表达式的其他部分
    • ^(?:'(?=.*')|(?=[^']+$)) 匹配 ' 如果该行也以 ' 结尾,或者只是一堆 non-single 引号(好吧,实际上只有一个)
      • (?:…) 是 non-capturing 组
      • '(?=.*') 是匹配 并消耗 前导 ' 的替代方案,如果该行也以 ' 结尾; (?=.*') 而不是 (?=.*'$) 的原因只是 $ 已经被正则表达式的另一部分强加了
      • (?=[^']+$) 不消耗任何东西,只是断言该行没有单引号

    另一个选项可以断言字符串不包含单个 ' 使用单个否定前瞻。

    ^(?![^'\r\n]*'[^'\r\n]*$)'?[a-z]'?$
    

    说明

    • ^ 字符串开头
    • (?! 否定前瞻,断言右边这个位置不是
    • ) 关闭前瞻
    • '?[a-z]'? 匹配 [a-z] 可选 '
    • $ 字符串结束

    Regex demo