我需要正则表达式以任何顺序匹配包含字母的任何单词: m + a + h + d 所以,穆罕默德, Hamada 和 Mahmoud 匹配,但锤不匹配 我尝试了以下操作(我是正则表达式的新手!):
Regex reg=new Regex("[mahd]");
但显然这不是正确的模式
答案 0 :(得分:2)
当您想要以任何顺序匹配某些子字符串时,您可以使用交替来枚举所有可能的变体,或使用锚定的前瞻。
在这种情况下,我建议使用正向前瞻,以确保单词中字母的自由顺序以及它们在匹配单词中的强制性存在。
使用
(?i)\b(?=\w*m)(?=\w*a)(?=\w*h)(?=\w*d)\w+
请参阅regex demo(注意:您可以将\w
替换为\p{L}
,仅匹配字母)。
详细:
(?i)
- \b
- 领先的单词边界(?=\w*m)
- 在0 +字词之后(即字母,数字或下划线),必须有m
(?=\w*a)
- 在0 +字符之后,必须有a
(?=\w*h)
- 在0 +字符之后,必须有h
(?=\w*d)
- 在0 +字符之后,必须有d
\w+
- 一个或多个字母,数字或下划线(您可以替换为\p{L}
以仅匹配字母)。var str = "Mohamed, Hamada and Mahmoud match, but not hammer";
var letters = "mahd";
var pat = string.Format(@"\b{0}\w+\b", string.Join("", letters.Select(s => string.Format(@"(?=\w*{0})", s))));
var result = Regex.Matches(str, pat, RegexOptions.IgnoreCase)
.Cast<Match>()
.Select(match => match.Value)
.ToList();
Console.WriteLine(String.Join("\n", result)); // Demo line