2016-12-01 78 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()); 

注意:这个字面上会发现里克前面有一个空格,就像您在问题中所要求的那样。