Skip to main content
 首页 » 编程设计

c#之如何匹配正则表达式中以空格分隔的所有单词

2024年02月20日28JustinYoung

我正在学习正则表达式,但仍然觉得很难学。
所以我的问题是这样的,我给了一组关键词:

The quick brown fox

我必须在一堆句子中找到的地方,例如:

the Brown SexyFox Jumps soQuickly in the backyard...

如果与这些词有任何匹配(不区分大小写):

The, the, brown, Brown, fox, Fox, quick, Quick

然后我可以说返回值是true

如何在正则表达式中做到这一点?我正在考虑拆分单词并放入数组并使用循环并使用 .Contains(...) 找到它们,但我知道这并不理想。

其实我还有一个顾虑。但我不敢将其作为新问题发布。
所以我的第二个问题是,正则表达式如何读取模式?什么是优先级和最低级优先级?
无论如何,请帮我解决我的问题。

编辑

抱歉回复晚了,@PatrikW 的解决方案好像不行。
我有静态类:

    public static bool ValidateRegex(string value, string regex) 
    { 
        value += ""; // Fail safe for null 
        Regex obj = new Regex(regex, RegexOptions.IgnoreCase); 
        if (value.Trim() == "") 
            return false; 
        else 
        { 
            return obj.IsMatch(value); 
        } 
    }   

构造正则表达式模式:

keyword = "maria"; 
            string regexPattern = "(?<=\b)("; 
            string Or = string.Empty; 
 
            foreach (string item in keyword.Split(new char[] { ' ', ',', '.' }, StringSplitOptions.RemoveEmptyEntries).ToList()) 
            { 
                regexPattern += Or + "(" + item + ")"; 
                Or = "|"; 
            } 
 
            regexPattern += ")(?=\b)";   

数据信息:

List<Friend> useritems = null; 
useritems = ((List<Friend>)SessonHandler.Data.FriendList).Where(i => 
    Utility.ValidateRegex(i.LastName, regexPattern) || 
    Utility.ValidateRegex(i.FirstName, regexPattern) || 
    Utility.ValidateRegex(i.MiddleName, regexPattern)).ToList(); 
 
//regexPattern = "(?<=\b)((maria))(?=\b)" 
//LastName = "MARIA CALIBRI" 
//FirstName = "ALICE" 
//MiddleName = null   

可能是我的代码有问题。请帮忙。

编辑 2
我忘记了 @ 符号。这现在必须工作:

string regexPattern = @"(?<=\b)("; 
. 
. 
. 
regexPattern += @")(?=\b)";   

下面的答案是正确的。

请您参考如下方法:

Felice 展示的是更动态的解决方案,但这里有一个用于查找您所拥有的确切关键字的模式:

"(?<=\b)((The)|(quick)|(brown)|(fox))(?=\b)" 

由于前导和尾随捕获组,它只会匹配整个单词而不是部分单词。

这是一个例子:

Regex foxey = new Regex(@"(?<=\b)((The)|(quick)|(brown)|(fox))(?=\b)"); 
foxey.Options = RegexOptions.IgnoreCase; 
bool doesMatch = foxey.IsMatching("the Brown SexyFox Jumps soQuickly in the backyard..."); 

编辑 - 正则表达式引擎:

简单地说,正则表达式引擎一次遍历输入字符串的一个字符,从最左边的字符开始,根据我们编写的正则表达式模式的第一部分检查它。如果匹配,解析器将移动到下一个字符并根据模式的下一部分检查它。如果它设法成功遍历整个模式,那就是匹配。

您可以通过搜索“regex engine”或类似的内容来了解​​ regex 的内部原理。这是一个选择: http://www.regular-expressions.info/engine.html