2015-10-20 133 views
1

我有以下场景,其中有一组短语,一些是几个单词,一些是单词,我想匹配所有这些短语但我目前的做法我最终匹配单个单词正则表达式 - 匹配两个单词或一个单词,但优先考虑两个单词

例如:

事情我可以匹配:

  • 晴天
  • 阳光谷

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

一句话:今天是一个阳光灿烂的日子

在这里,我希望“阳光灿烂的日子”然而相匹配,我正则表达式始终以“天”相匹配,有可能是其他句子,只包含我想要匹配的一天。

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

+0

您有空间捕获组。这是故意的吗? –

+0

@emartinelli不是故意的,我只是想在那里指定一个空间而没有得到混合的结果,也许有更好的方法来做到这一点? – perrohunter

+0

您可以使用'\ s'来表示空格。但即使使用“真实空间”,也不需要括号,因为在这种情况下,它只会生成其他匹配。例如:使用@stribizhev答案和您的输入,'晴天'和空间将匹配。为了不符合这个额外的空间,请使用'\ b(sunny \ sday | sunny \ svalley | day)\ b'[(demo)](https://regex101.com/r/iS9bY7/1) –

回答

2

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

用字边界仅匹配全字:

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

regex demo

+1

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

1

为了不产生额外的空间相匹配。关注OP的评论。我的建议是正则表达式:

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


诗:

\s是空间

括号是没有用的,因为空间匹配不是在这种情况下可取的。

相关问题