【问题标题】:Multiple conditions in a Perl regexPerl 正则表达式中的多个条件
【发布时间】:2016-03-31 16:34:34
【问题描述】:

这是一个关于 Perl 正则表达式的非常具体的问题,我希望它不会不合适。

我有一个匹配几个单词之一的正则表达式:

/foo|pizza|chicken/

和一个匹配 5 个或更多单词的:

(?:\w+ ?){5,}

我需要将这两者组合成一个正则表达式(实现限制)。这可能与单个正则表达式?

  • 我喜欢吃很多披萨。 应该匹配
  • 我喜欢披萨上的鸡肉。 应该匹配
  • 我需要正则表达式方面的帮助。 不应匹配
  • 我喜欢 foo。 不应匹配

提前致谢!

【问题讨论】:

  • 您的第二个正则表达式不匹配 5 个或更多单词,它匹配一个或多个字母数字字符后跟可选空格,5 次。这意味着它匹配abcde,我猜你不想要。

标签: regex perl


【解决方案1】:

是的,您可以使用positive lookahead assertion 添加条件:

/^(?=.*\b(?:foo|pizza|chicken)\b)(?:\b\w+\b ?){5,}/

测试它live on regex101.com

我添加了word boundary anchors 以避免foodpizzazz 等单词不匹配,并确保\w+ 始终匹配整个单词。

一个稍微高效的替代方案使用possessive quantifiers 来确保同样的事情:

/^(?=.*\b(?:foo|pizza|chicken)\b)(?:\w++ ?){5,}/

测试它live on regex101.com

【讨论】:

  • 你以前的版本更好。
  • @CasimiretHippolyte:我想知道什么会更好 - 我认为单词边界更明确且更容易理解,但我可能错过了一些东西......你为什么更喜欢所有格的版本量词?
  • 我觉得它更直接、更短、更优雅。您应该将其添加到您的答案中。
  • 完美。谢谢@TimPietzcker!
  • 那里应该是\s*
猜你喜欢
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多