C#正则表达式匹配字符串中的多个单词

时间:2014-04-11 13:52:19

标签: c# regex

如何使用在C#中运行的正则表达式找到字符串中的所有匹配项?

我想在下面的示例字符串中找到所有匹配项。 例如:

inputString: Hello (mail) byebye (time) how are you (mail) how are you (time)

我希望与示例中的(mail)(time)匹配。包括括号()

在尝试解决此问题时,我写了以下代码。

string testString = @"(mail)|(time)";  

Regex regx = new Regex(Regex.Escape(testString), RegexOptions.IgnoreCase);
List<string> mactches = regx.Matches(inputString).OfType<Match>().Select(m => m.Value).Distinct().ToList();

foreach (string match in mactches)
{
    //Do something
}

管道(|)是否用于逻辑OR条件?

2 个答案:

答案 0 :(得分:8)

使用Regex.Escape(testString)将转义管道角色,转向

@"(mail)|(time)" 

有效地进入

@"\(mail\)\|\(time\)".

因此,你的正则表达式正在寻找文字"(mail)|(time)"

如果你的所有比赛都像parens包围的单词一样简单,我会像这样建立正则表达式:

List<string> words   = new List<string> { "(mail)", "(time)", ... };
string       pattern = string.Join("|", words.Select(w => Regex.Escape(w)));
Regex        regex   = new Regex(pattern, RegexOptions.IgnoreCase);

答案 1 :(得分:3)

转义测试字符串中的括号:

string testString = @"\(mail\)|\(time\)";

删除Regex.Escape

Regex regx = new Regex(testString, RegexOptions.IgnoreCase);

输出(包括括号)

(mail)
(time)

Regex.Escape在您的情况下不起作用的原因是它也逃脱了|字符:

  

通过用\ code代替它们来转义一组最小元字符(\,*,+,?,|,{,[,(,),^,$,。,#和空格)。