正则表达式匹配任何包含特定字母或更多字母的单词?

时间:2016-09-14 21:20:08

标签: c# regex

我需要正则表达式以任何顺序匹配包含字母的任何单词: m + a + h + d 所以,穆罕默德 Hamada Mahmoud 匹配,但不匹配 我尝试了以下操作(我是正则表达式的新手!):

Regex reg=new Regex("[mahd]");

但显然这不是正确的模式

1 个答案:

答案 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}以仅匹配字母)。

C# demo

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