求两个C#正则表达式:按空格分割但排除指定特殊字符区间内容
C#正则表达式解决方案
需求1:按空格分割文本,排除[:与:]之间的内容
使用以下正则表达式匹配所有需要保留的片段(通过匹配目标内容而非直接分割实现需求):
@"\[:.*?:\]|[^ ]+"
代码示例
string input1 = "one [two two] three [:four four:] five six [seven seven:] [:eight eight]"; var parts1 = Regex.Matches(input1, @"\[:.*?:\]|[^ ]+") .Cast<Match>() .Select(m => m.Value) .ToArray();
输出结果
one [two two] three [:four four:] five six [seven seven:] [:eight eight]
正则说明
\[:.*?:\]:匹配以[:开头、:]结尾的完整片段(非贪婪模式确保只匹配到最近的:]),保留其中的空格。[^ ]+:匹配任意连续非空格字符,实现对其他区域按空格分割。
需求2:按空格分割文本,排除[:与:]、[与]之间的内容
使用以下正则表达式:
@"\[:.*?:\]|\[(?!:).*?\]|[^ ]+"
代码示例
string input1 = "one [two two] three [:four four:] five six [seven seven:] [:eight eight]"; var parts2 = Regex.Matches(input1, @"\[:.*?:\]|\[(?!:).*?\]|[^ ]+") .Cast<Match>() .Select(m => m.Value) .ToArray();
输出结果
one [two two] three [:four four:] five six [seven seven:] [:eight eight]
正则说明
\[:.*?:\]:同需求1,保留[:...:]内的空格。\[(?!:).*?\]:匹配以[开头但紧跟的不是:的完整[...]片段(非贪婪模式匹配到最近的]),保留其中的空格。[^ ]+:同需求1,分割其他区域的空格。
原代码问题分析
你之前使用的正则@"[[::]].+?[\[::]]|[^ ]+"存在逻辑错误:
[[::]]是字符类,仅匹配单个[或:字符,而非完整的[:开头标识。.+?[\[::]]会匹配任意字符直到遇到[、:或],导致错误地将[two two] three [:four four:]合并为一个片段。
内容的提问来源于stack exchange,提问作者Anil Kumar
相关产品推荐
相关产品推荐

