如何从群组中获取Regex.Split的正确结果

时间:2014-05-16 15:04:49

标签: c# .net regex

我想找到a)输入字符串中与模式匹配的所有部分;和b)输入字符串中与相同模式不匹配的所有部分。我正在使用Regex.Matches找到匹配的部分,我正在尝试使用Regex.Split删除匹配的部分,并留下不匹配的部分。该模式是用户定义的,因此不允许将捕获组更改为非捕获组。

所以,我认为Regex.Split应该删除匹配的文本并返回字符串所有剩余部分的数组。例如,带有模式“bc”的输入字符串“abcd”将返回一个包含2个元素“a”和“d”的字符串数组。

但是当您向模式添加组时,结果会变得虚假。如果你运行这个:

Regex.Split("abcd", "b(c)")

结果是:

a
c
d

为什么“c”出现在分裂的结果中?这是我想分开的模式的一部分。我使用相同的模式来获取匹配并拆分字符串,因此将组更改为非捕获组是不可接受的。有没有办法用正则表达式模式分割字符串(Regex.Split明显坏了)?

==

答案:如果模式包含捕获组,则无法使用Regex.Split在模式匹配之间获取字符串的部分。

3 个答案:

答案 0 :(得分:1)

此功能的MSDN page说明:

  

如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。例如,如果你拆分字符串" plum-pear"在捕获括号内的连字符上,返回的数组包含一个包含连字符的字符串元素。

因此您希望通过向其添加?:来删除此捕获组:

Regex.Split("abcd", "b(?:c)")

如果您不想更改表达式但删除捕获,则应使用其他功能:

答案 1 :(得分:1)

根据http://msdn.microsoft.com/en-us/library/ze12yx1d%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-4

,这是正确的行为

正好在这个片段之上:

  

如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。

答案 2 :(得分:1)

根据文件

  

如果在Regex.Split表达式中使用捕获括号,则为any   捕获的文本是       包含在结果字符串数组中。例如,如果您拆分字符串       位于捕获括号内的连字符上的“plum-pear”,返回的数组       包含一个包含连字符的字符串元素。

您将匹配定义为b(c)会导致c被捕获为一个组,因此它将包含在结果中。你需要匹配“bc”,它只会在出现bc时匹配。