为何使用Regex.Split拆分正则表达式时会保留分隔符?
问题分析与解决:Regex.Split保留分隔符的原因及修复方法
嘿,这个问题我太熟了!你遇到的情况是因为Regex.Split对捕获组的处理逻辑——当你在正则里用了带括号的捕获组时,它不仅会用这些匹配内容作为拆分点,还会把捕获到的分隔符本身也放进结果数组里。你的正则(\\s+)|([\\p{P}\\p{S}])里有两个捕获组,所以拆分后;和空格这些分隔符自然就被保留下来了。
要解决这个问题,核心就是告诉正则不要捕获这些分隔符,这里有两个关键步骤:
- 使用非捕获组替换捕获组:把正则里的
(...)改成(?:...),这样分组只用来匹配规则,不会把匹配到的分隔符存入结果数组。 - 过滤空字符串:拆分后可能会出现空元素(比如分隔符在开头、结尾或者连续出现时),需要额外过滤掉这些无效内容。
修改后的代码如下:
string s = "test;3 régred"; string[] authorsList = Regex.Split(s, "(?:\\s+)|(?:[\\p{P}\\p{S}])") .Where(x => !string.IsNullOrEmpty(x)) .ToArray(); foreach (string q in authorsList) { Console.WriteLine(q); }
如果你觉得两个非捕获组有点啰嗦,还可以把它们合并成一个更简洁的写法,效果完全一样:
string[] authorsList = Regex.Split(s, "(?:\\s+|[\\p{P}\\p{S}])") .Where(x => !string.IsNullOrEmpty(x)) .ToArray();
运行这段代码后,就能得到你预期的结果:只保留test、3、régred这三个有效内容啦。
内容的提问来源于stack exchange,提问作者user6911980
相关产品推荐
相关产品推荐

