带有空组“()”的正则表达式返回奇怪的结果

时间:2010-01-29 03:47:46

标签: c# .net regex

这有点推动边缘,但我对这个正则表达式有以下情况 - “()”:当用于将字符串拆分为string []数组时,结果对我来说有些奇怪。例如,这行代码:

string[] res = new Regex("()").Split("hi!");

res设置为9个(!)元素的数组:[“”,“”,“h”,“”,“i”,“”,“!”,“”,“”]

我期待它返回这5个元素:[“h”,“”,“i”,“”,“!” ]。 我需要这个特定结果的原因是为了与另一个正则表达式库兼容...

我的问题是,这种行为是否可能是由于正则表达式对象的一些缺失选项或某些编码问题或类似问题...或者它是以某种方式确定的,并且绝对是它应该工作的正确方法?另外,有没有办法强制它返回第二个(预期的)结果呢?

2 个答案:

答案 0 :(得分:3)

我会说九个元素是正确的,因为表达式在“h”之前和“!”之后也匹配。

为了避免在开头或结尾处匹配,您可以添加前瞻/后方以确保空匹配周围有更多字符:"(?<=.)()(?=.)"

答案 1 :(得分:3)

我已使用|字符指出了正则表达式匹配的位置: "|h|i|!|"

Split返回一个数组,其元素全部位于两个相邻匹配之间,或者在字符串的开头和第一个匹配之间,或者在最后一个匹配和字符串结尾之间。它按照它们在字符串中出现的顺序返回它们。这给出了这个结果: ["","h","i","!",""]

这解释了9个数组元素中的5个。

但是,“如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。” (来自msdn的直接引用,这里:http://msdn.microsoft.com/en-us/library/ze12yx1d.aspx

在这种情况下,捕获的文本是空字符串。由于我们有4场比赛,这解释了结果中的其他4个元素。

因此,完整的结果是: ["","","h","","i","","!","",""]

相关问题