2016-09-14 35 views
0

我需要一個正則表達式匹配包含任何字母詞:以任意順序 所以M + A + H + d一起不這樣做,穆罕默德馬哈茂德比賽,但錘比賽 我試着做到以下幾點(我是新來的正則表達式!):正則表達式以匹配任何含有特定字母或更大字母的單詞嗎?

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

但顯然是不正確的模式

+0

應該'「啊d先生」'被接受(字符串包含所有需要的字符)或拒絕(字符串包含三個獨立的字,每個人不包含*所有*預期字符)? –

+0

不,整個單詞不是句子 –

+0

如果您需要從較長的文本中提取這些單詞,請使用['\ b(?= \ w * m)(?= \ w * a)(?= \ w * h) (?= \ W * d)\ W +'](http://regexstorm.net/tester?p=%5cb(%3F%3D%5CW * M)(%3F%3D%5CW * A)(%3F %三維%5CW * H)(%3F%3D%5CW * d)%5CW%2b是I =穆罕默德%2C +濱+和+馬哈茂德+匹配%2C +但+錘&O = I)。如果你將它們作爲單獨的字符串進行測試,使用'^(?= \ w * m)(?= \ w * a)(?= \ w * h)(?= \ w * d)\ w + –

回答

1

如果要按任意順序匹配某些子字符串,可以使用列舉了所有可能的變體的替代方法,或使用錨定的預覽。

在這種情況下,我建議使用積極的lookaheads,這將確保一個單詞中的字母的自由順序和他們在匹配單詞中的強制性存在。

使用

(?i)\b(?=\w*m)(?=\w*a)(?=\w*h)(?=\w*d)\w+ 

regex demo注意:您可以與\p{L}取代\w只匹配字母)。

詳細

  • (?i) - 上
  • \b不區分大小寫模式 - 領先字邊界
  • (?=\w*m) - 0+後字字符(即字母,數字或下劃線),必須有是m
  • (?=\w*a) - 0+字符後,必須有a
  • (?=\w*h) - 後0+字字符,必須有h
  • (?=\w*d) - 後0+字字符,必須有d
  • \w+ - 1個或多個字母,數字或下劃線(你可以用\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 
相關問題