我正在研究正则表达式,但仍然难以学习 所以我的问题是这个,我给出了一组关键字:
快速的棕色狐狸
我必须在一堆句子中找到:
Brown SexyFox在后院快速跳跃......
如果与这些单词匹配(不是Casesensitive):
,棕色,棕色,狐狸,狐狸,快速,快速
然后我可以说返回值为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)";
以下答案是正确的。
答案 0 :(得分:3)
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...");
编辑 - 正则表达式引擎:
简单地说,正则表达式引擎一次遍历输入字符串中的一个字符,从最左边开始,检查它与我们编写的正则表达式模式的第一部分。如果匹配,则解析器移动到下一个字符并将其与模式的下一部分进行对比。如果它设法成功遍历整个模式,那就是匹配。
您可以通过搜索“正则表达式引擎”或其他内容来了解正则表达式的内部结构。这是一个选择: http://www.regular-expressions.info/engine.html