【问题标题】:Using Regex Anchors in an OR class?在 OR 类中使用正则表达式锚?
【发布时间】:2014-03-27 06:21:23
【问题描述】:

假设我正在以逗号分隔的列表中查找单词 test。单词test 可以位于字符串的开头、字符串的中间或字符串的末尾。因此,假设我有一系列行,包括以下内容:

 this,test,should,match
 test,should,match
 should,match,test
 this,ttest,should,not,match

请注意,第 4 行包含 ttest 而不是 test,我不希望它匹配。是否有一个正则表达式可以匹配前 3 行,但不匹配第四行?我是从这个开始的:

[,]test[,]

这当然会匹配第 1 行,而不是第 4 行,但不会匹配 2 和 3,因为它不会匹配行首或行尾。有没有办法将开始和结束锚点添加到 [,] 字符类以包含它们?

【问题讨论】:

    标签: regex


    【解决方案1】:

    您没有说明您使用的是什么正则表达式引擎,因此无法明确回答;但许多引擎支持符号 foo|bar 用于交替,符号 (foo) 用于分组,因此您很可能会这样写:

    (^|,)test(,|$)
    

    【讨论】:

    • 这行得通,谢谢。我试图用[fo] 字符类来做到这一点,但这不支持行边界。然而,在 PCRE 中,(foo) 不是回调类吗?
    • @JasonAxelrod:我不确定您所说的“回调类”是什么意思。如果您的意思是它会执行捕获以及分组(以便您可以参考匹配的子字符串),那么 - 是的。你可以通过写(?:foo) 来避免这种情况。我选择了(foo),因为它适用于更多种类的正则表达式引擎。 (以后请记住,一个问题永远不应该有only 'regex' 标签,因为'regex' 可能意味着很多不同的东西。你应该始终清楚你需要什么样的正则表达式.)
    【解决方案2】:

    如果您没有使用 or 子句,并且假设每个组中只有一个单词,则另一种选择是

    \btest\b
    

    【讨论】:

      【解决方案3】:

      ruakh 的回答直接解决了您的问题,但是更简单的解决方案是使用单词边界而不是寻找锚点和逗号:

      \btest\b

      【讨论】:

      • 哦...我从来不知道单词边界。但是,我认为这行不通,因为它也会匹配破折号和下划线,而我只需要它来匹配逗号和行边界。
      • 您的数据只有字母。您必须将所有信息都放入您的问题中,否则我们会给您提供无效的答案,对吗? ;)
      猜你喜欢
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2010-09-16
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多