【问题标题】:How do I match a pattern with optional surrounding quotes?如何将模式与可选的周围引号匹配?
【发布时间】:2010-08-25 18:19:11
【问题描述】:

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

"?(pattern)"?

不起作用,因为它允许以引号开头但不以引号结尾的模式。

"(pattern)"|(pattern)

会起作用,但会重复。有没有更好的方法可以在不重复模式的情况下做到这一点?

【问题讨论】:

标签: regex quotations repeat surround


【解决方案1】:

使用backreferencesconditionals 可以得到一个无需重复的解决方案:

/^(")?(pattern)(?(1)\1|)$/

匹配:

  • 模式
  • “模式”

不匹配:

  • "模式
  • 模式”

不过,这种模式有些复杂。它首先查找可选引用,如果找到,则将其放入反向引用 1。然后它会搜索您的模式。然后它使用条件语法说“如果再次找到反向引用 1,则匹配它,否则不匹配”。整个模式是anchored(这意味着它需要单独出现在一行上),这样不匹配的引号就不会被捕获(否则pattern" 中的pattern 会匹配)。

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


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

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

【讨论】:

  • Aaarrg,我刚开始在 Friedel 书中查找 regex-if 条件语法。你更快+1(下一个+1是递归模式;-)
  • @rubber 曾几何时,我知道如何进行递归正则表达式,但我想我为了人类的利益而忘记了;)
  • @Daniel:如果您也忘记条件句,人类可能不会介意。 ^("?)pattern\1$ 工作得很好。 (@wuputah 删除的答案没有用,因为它没有锚定。@Tim,不需要所有格量词/原子组。)
  • @Alan 也许最后一段中的注释应该更清楚,但我并不建议使用条件是最好的方法。事实上,我从未在生产代码中使用过条件。我只是认为这是解决问题的一种有趣方式。
  • @Alan 似乎我使用的正则表达式测试器有一个错误并且给了我一个错误的否定 ^("?)pattern\1$ 这导致我首先尝试条件解决方案......哎呀。
【解决方案2】:

这也很简单:(".+"|.+)。确保第一个匹配项带有引号,第二个不带引号。

【讨论】:

  • 我很惊讶为什么没有人喜欢这个。它非常简单优雅。
【解决方案3】:

根据您使用的语言,您应该能够使用反向引用。像这样,说:

(["'])(pattern)\1|^(pattern)$

这样,您要求要么没有引号,要么两端使用相同的引号。

【讨论】:

    【解决方案4】:

    这应该适用于递归正则表达式(需要更长的时间才能正确)。同时:在 Perl 中,您可以构建一个自修改正则表达式。我将把它作为一个学术例子;-)

    my @stuff = ( '"pattern"', 'pattern', 'pattern"', '"pattern'  );
    
    foreach (@stuff) {
       print "$_ OK\n" if /^
                            (")?
                            \w+
                            (??{defined $1 ? '"' : ''})
                           $
                          /x
    }
    

    结果:

    "pattern" OK
    pattern OK
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2017-02-23
      • 1970-01-01
      相关资源
      最近更新 更多