C# 如何从正则表达式中获得正确的结果。使用组拆分

C# 如何从正则表达式中获得正确的结果。使用组拆分,c#,.net,regex,C#,.net,Regex,我想找到a)输入字符串中与模式匹配的所有部分;和b)输入字符串中与同一模式不匹配的所有部分。我正在使用Regex.Matches查找匹配的部分,并尝试使用Regex.Split删除匹配的部分,留下不匹配的部分。该模式是用户定义的,因此将捕获组更改为非捕获组是不可接受的 因此,我认为Regex.Split应该删除匹配的文本并返回字符串所有剩余部分的数组。例如,模式为“bc”的输入字符串“abcd”将返回一个包含两个元素“a”和“d”的字符串数组 但当你向模式中添加组时,结果都是假的。如果运行此命令

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

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

但当你向模式中添加组时,结果都是假的。如果运行此命令:

Regex.Split("abcd", "b(c)")
结果是:

a
c
d
为什么拆分结果中会出现“c”?这是我想要拆分的模式的一部分。我使用相同的模式来获取匹配和分割字符串,因此将组更改为非捕获组是不可接受的。是否有任何方法可以使用正则表达式模式实际拆分字符串(regex.split显然已断开)

======

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

此功能的状态为:

如果在Regex.Split表达式中使用捕获括号,则所有捕获的文本都将包含在结果字符串数组中。例如,如果在捕获括号内的连字符上拆分字符串“梅花梨”,则返回的数组包含一个包含连字符的字符串元素

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

Regex.Split("abcd", "b(?:c)")
如果不想更改表达式但要删除捕获,则应使用另一个函数:

  • 使用选项:
    ExplicitCapture
此功能的状态为:

如果在Regex.Split表达式中使用捕获括号,则所有捕获的文本都将包含在结果字符串数组中。例如,如果在捕获括号内的连字符上拆分字符串“梅花梨”,则返回的数组包含一个包含连字符的字符串元素

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

Regex.Split("abcd", "b(?:c)")
如果不想更改表达式但要删除捕获,则应使用另一个函数:

  • 使用选项:
    ExplicitCapture

根据法律,这是正确的行为

此代码段正上方:

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


根据法律,这是正确的行为

此代码段正上方:

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


根据文件

如果在Regex.Split表达式中使用捕获括号,则 捕获的文本是 包含在结果字符串数组中。例如,如果拆分字符串 “李子梨”位于捕捉括号内的连字符上,返回数组 包含包含连字符的字符串元素


将匹配定义为b(c)会导致将c捕获为一个组,从而将其包含在结果中。相反,您需要匹配“bc”,它仅在bc出现时匹配。

根据文档

如果在Regex.Split表达式中使用捕获括号,则 捕获的文本是 包含在结果字符串数组中。例如,如果拆分字符串 “李子梨”位于捕捉括号内的连字符上,返回数组 包含包含连字符的字符串元素


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

我知道这是设计造成的,但就我而言,它被设计破坏了。@Nick不,它没有破坏,因为这是默认行为,但不是唯一的行为。设计允许您选择是否需要此行为。@Nick考虑到在
拆分
匹配
之间共享正则表达式的情况极为罕见(这是我第一次看到这一建议,更不用说实现了),设计非常合理。您如何选择是否需要此行为?其行为是,它包括捕获组,而不是像其名称所暗示的那样,在模式匹配的位置拆分输入字符串。将捕获组更改为非捕获组并不会改变这种行为,它只是避免了这种行为,因为(有时但并不总是可行的)处理奇怪的行为。@Nick您无法理解某些事情的事实并不意味着它是错误的。祝你好运我知道这是故意的,但就我而言,这是故意的。@Nick不,这不是故意的,因为这是默认行为,但不是唯一的行为。设计允许您选择是否需要此行为。@Nick考虑到在
拆分
匹配
之间共享正则表达式的情况极为罕见(这是我第一次看到这一建议,更不用说实现了),设计非常合理。您如何选择是否需要此行为?其行为是,它包括捕获组,而不是像其名称所暗示的那样,在模式匹配的位置拆分输入字符串。将捕获组更改为非捕获组并不会改变这种行为,它只是避免了这种行为,因为(有时但并不总是可行的)处理奇怪的行为。@Nick您无法理解某些事情的事实并不意味着它是错误的。祝你好运不,我不想删除捕获组。我正在使用Regex.Matches和Regex.Split