2016-12-01 50 views
0

我有一個包含名稱的字符串,如避免重複匹配,如果匹配空格前面

"james frederick ricky rick jones" 

我想第一個匹配的「麥垛」通過一個空白

的先拆分此字符串代碼如下(在C#)

string source = "james frederick ricky rick jones"; 
string expression = "(rick)(?<!\1.*\1)"; 

string[] chunks = Regex.Split(source, expression, RegexOptions.IgnoreCase); 

我,結果得到的是這樣的

[0] - "james frede" 
[1] - "rick" 
[2] - "ricky rick jones" 

是否可以更改或修改正則表達式以獲得以下結果?

[0] - "james frederick" 
[1] - "rick" 
[2] - "y rick jones" 
+0

你是什麼意思第一**首先匹配「瑞克」**,如果有**許多瑞奇瑞克後來**?如果FIRST意味着**只有一個**,'string.IndexOf'就簡單多了。我的例子中的 –

+0

與Frederick中的「rick」相匹配。但我只需要匹配只有第一個「瑞克」先行與空白。如果之後有很多ricky或rick,他們不應該匹配。 –

+0

那你爲什麼選擇'regex'而不是'IndexOf',考慮性能,可維護性和簡單性(這就是爲什麼你在這裏問)? –

回答

0

試試這個:

(?:\s)+(rick)

(?:\s)+是「麥垛」,所以應該是你在找什麼之前的空間1個或多個匹配的非選擇捕獲組檢查。

0

這是非常接近你的嘗試。在正則表達式的「rick」之前放置一個空格。

string source = "james frederick ricky rick jones"; 
string expression = @"(\srick)(?<!\1.*\1)"; 

string[] chunks = Regex.Split(source, expression, RegexOptions.IgnoreCase); 
var ch = chunks.Select(c =>c.TrimStart()); 

注意:這個字面上會發現裏克前面有一個空格,就像您在問題中所要求的那樣。