我想找到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在模式匹配之间获取字符串的部分。
答案 0 :(得分:1)
此功能的MSDN page说明:
如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。例如,如果你拆分字符串" plum-pear"在捕获括号内的连字符上,返回的数组包含一个包含连字符的字符串元素。
因此您希望通过向其添加?:
来删除此捕获组:
Regex.Split("abcd", "b(?:c)")
如果您不想更改表达式但删除捕获,则应使用其他功能:
ExplicitCapture
See option page 答案 1 :(得分:1)
正好在这个片段之上:
如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。
答案 2 :(得分:1)
根据文件
如果在Regex.Split表达式中使用捕获括号,则为any 捕获的文本是 包含在结果字符串数组中。例如,如果您拆分字符串 位于捕获括号内的连字符上的“plum-pear”,返回的数组 包含一个包含连字符的字符串元素。
您将匹配定义为b(c)会导致c被捕获为一个组,因此它将包含在结果中。你需要匹配“bc”,它只会在出现bc时匹配。