C#Regex匹配字符串中的多个单词

本文关键字:单词 字符串 C#Regex | 更新日期: 2023-09-27 17:57:58

如何使用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条件?

C#Regex匹配字符串中的多个单词

使用Regex.Escape(testString)将转义管道字符,使

@"(mail)|(time)" 

有效地进入

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

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

如果你所有的匹配都像用括号括起来的单词一样简单,我会构建这样的正则表达式:

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);

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

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

删除Regex.Escape:

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

输出(包括括号)

(mail)
(time)

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

转义一组最小的元字符('',*,+,?,|,{,[,(,),^,$,.,#和空白),方法是将它们替换为它们的''代码。