【问题标题】:Regex - Match two words or one word, but give preference to two words正则表达式 - 匹配两个词或一个词,但优先考虑两个词
【发布时间】:2015-10-20 17:10:27
【问题描述】:

我有以下场景,我有一组短语,有些是几个单词,有些是单独的单词,我想匹配所有这些短语,但我目前的方法最终匹配单个单词

例如:

我可以匹配的东西:

  • 晴天
  • 阳光谷
  • 天

正则表达式:(sunny( )day|sunny( )valley|day)

句子:今天是晴天

在这里,我希望匹配“晴天”,但是,我的正则表达式总是匹配“天”,可能还有其他包含仅包含天的句子我想匹配。

有谁知道如何设计一个完成这项任务的正则表达式?

【问题讨论】:

  • 您有空间捕获组。是故意的吗?
  • @emartinelli 不是故意的,我只是想在此处指定一个空间而不会得到混合结果,也许有更好的方法来做到这一点?
  • 你可以使用'\s'来表示一个空格。但即使使用“真实空间”,您也不需要括号,因为在这种情况下,它只会生成额外的匹配项。例如:使用@stribizhev 答案和您的输入,“晴天”和空格将被匹配。要不匹配这个额外的空间,请使用 '\b(sunny\sday|sunny\svalley|day)\b' (demo)

标签: java python regex


【解决方案1】:

您的正则表达式匹配“today”中的“day”,因为它是输入字符串中最左边(第一个)“day”子字符串。

使用单词边界仅匹配整个单词:

\b(sunny( )day|sunny( )valley|day)\b

见regex demo

【讨论】:

  • 就是这样,我实际上在我的代码生成的正则表达式中使用了 \b (\bsunny( )day\b|\bday\b) 但我没有得到想要的结果,你的建议在外面组的,现在我得到了最长的匹配,谢谢!将在 10 分钟内标记为正确答案 :)
【解决方案2】:

不生成额外的空格匹配。按照OP的评论。我建议这个正则表达式:

\b(sunny\sday|sunny\svalley|day)\b(demo)


附言:

\s 用于空格

括号没有用,因为在这种情况下不希望匹配空格。

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多