如何使用正则表达式匹配字符串中的多个单词?

时间:2014-08-18 03:36:06

标签: c# regex regex-lookarounds

我正在尝试匹配可出现在字符串中任何位置的3个单词:

Win
Enter
Now

字符串中必须存在所有3个单词才能返回匹配项。但是当我确实存在所有3个单词时,我遇到了匹配问题。

以下是我正在使用的正则表达式:http://regexr.com/39b83

^(?=.*?win)(?=.*?(enter))(?=.*?(now)).*

当所有三个单词都在同一行内时,正则表达式正在工作 ...当它在不同行上的整个字符串中展开时,它无法匹配。

感谢任何方向或帮助。

5 个答案:

答案 0 :(得分:2)

由于你不想匹配像中心这样的单词(用“enter”这个词),我会用:

/(\benter\b)|(\bwin\b)|(\bnow\b)/

链接到Fiddler

答案 1 :(得分:1)

怎么样......

/(win|enter|now)/gi

regex diagram

答案 2 :(得分:1)

我认为C#会支持(?s) DOTALL修饰符。如果是,那么你可以试试下面的正则表达式,

(?i)(?s)win.*?enter.*?now

答案 3 :(得分:0)

听起来你想要匹配这些单词出现的行,最多三行。这并不容易,但是:

/^.*win.*(?:\s+.*)?enter.*(?:\s+.*)?now.*|^.*win.*(?:\s+.*)?now.*(?:\s+.*)?enter.*|^.*enter.*(?:\s+.*)?win.*(?:\s+.*)?now.*|^.*enter.*(?:\s+.*)?now.*(?:\s+.*)?win.*|^.*now.*(?:\s+.*)?win.*(?:\s+.*)?enter.*|^.*now.*(?:\s+.*)?enter.*(?:\s+.*)?win.*/igm

should do it.

答案 4 :(得分:0)

这是因为点与换行符没有匹配。要改变这一点,你必须采取各种方式。第一个,使用s修饰符(允许点匹配换行符):

(?s)^(?=.*\bwin\b)(?=.*\benter\b)(?=.*\bnow\b).*

但是这个功能并不总是可用的(例如在Javascript中)。第二种方法是用[\s\S](一个匹配所有字符的字符类)替换点:

^(?=[\s\S]*\bwin\b)(?=[\s\S]*\benter\b)(?=[\s\S]*\bnow\b)[\s\S]+