字符串按空格拆分时,如何避免拆分括号内的大写内容?
解决方案:按空格拆分但保留括号内大写内容
嘿,这个需求我太熟悉了!普通的Split(' ')会把所有空格一刀切,肯定没法保留(TAKE SOT)这种带空格的括号内容。咱们可以用正则表达式来精准控制拆分逻辑,这里给你两种靠谱的实现方式:
方法一:直接匹配所有需要保留的「内容块」
这种思路更直观——不找分隔符,反而找出所有我们想要保留的单元:要么是括号内的大写内容(含空格),要么是其他非空格的连续字符。
代码示例
string content = "Tonight the warning from the Police commissioner as they crack down on anyone who leaves there house without a 'reasonable excuse' (TAKE SOT)"; // 正则规则:匹配括号内的大写字母+空格,或者非空格的连续字符 var blockRegex = new Regex(@"\([A-Z\s]+\)|[^ ]+"); var contentList = blockRegex.Matches(content) .Cast<Match>() .Select(match => match.Value) .ToArray();
效果说明
运行后contentList里的元素会是:Tonight, the, warning, ..., 'reasonable, excuse', (TAKE SOT)
完美保留了括号内的完整内容!如果你的括号内内容不只是大写,还想兼容其他字符,可以把正则改成@"\([^)]+\)|[^ ]+"——这样会匹配从左括号到右括号之间的所有内容,不管是什么字符。
方法二:仅拆分括号外的空格
另一种思路是精准定位「可以拆分的空格」——也就是那些不在括号范围内的空格,用它们作为分隔符来拆分字符串。
代码示例
string content = "Tonight the warning from the Police commissioner as they crack down on anyone who leaves there house without a 'reasonable excuse' (TAKE SOT)"; // 正则规则:匹配不在括号内的空格 var splitRegex = new Regex(@"(?![^(]*\)) "); var contentList = splitRegex.Split(content);
正则解释
(?![^(]*\))是一个正向否定预查,它的意思是:当前空格的后面,不会出现「先有一堆非左括号字符,再出现右括号」的情况——换句话说,这个空格不在括号里面,所以可以安全拆分。
注意事项
- 如果你的字符串里有嵌套括号(比如
(TAKE (SOT) NOW)),上面的正则需要调整,不过针对你给出的单层括号场景完全够用; - 可以根据实际需求修改正则规则,比如适配不同类型的括号(
[]/{})或者内容格式。
内容的提问来源于stack exchange,提问作者Jayoti Parkash
相关产品推荐
相关产品推荐

