You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Regex.Split按$拆分字符串:匹配异常及符合要求的拆分需求

解决正则拆分字符串的问题

我来帮你搞定这个正则拆分的问题!你遇到的核心问题是原来的\w+只能匹配字母、数字和下划线,没法覆盖.、*这类你需要保留的字符,所以导致拆分结果不符合预期。

核心思路调整

你的本质需求是:把$作为分隔标记,但要保留$开头且不包含空白的整个子串,同时保留原字符串里的所有空白字符。那我们只需要把正则里匹配$后续内容的部分从\w+改成匹配所有非空白字符的\S+就可以了。

修改后的代码

var str = "sfdd fgjhk fguh $turn.bak.orm $hahr*____f";
// 用\S+匹配$后的所有非空白字符,同时用捕获组保留拆分出的$开头子串
var list = Regex.Split(str, @"(\$\S+)").Where(x => !string.IsNullOrEmpty(x)).ToList();
foreach (var item in list) { 
    Console.WriteLine($"\"{item}\""); 
}

输出结果(符合你的预期)

"sfdd fgjhk fguh "
"$turn.bak.orm"
" "
"$hahr*____f"

正则表达式解释

  • \$:转义匹配$符号(因为$在正则里是行尾的特殊标记,必须转义才能匹配字面量)
  • \S+:匹配一个或多个非空白字符,这样就能包含.、*、下划线等你需要的字符,同时遇到空白就停止,保证$开头的子串不包含空白
  • 外层的():将$开头的子串作为捕获组,这样Regex.Split会把捕获的内容保留在结果列表里(默认Split会去掉分隔符,捕获组可以让我们保留它)

补充:满足不区分大小写需求

如果后续$后面的内容需要不区分大小写匹配(比如$Turn和$turn都要被正确捕获),只需要在Regex.Split里加上RegexOptions.IgnoreCase参数即可:

var list = Regex.Split(str, @"(\$\S+)", RegexOptions.IgnoreCase).Where(x => !string.IsNullOrEmpty(x)).ToList();

内容的提问来源于stack exchange,提问作者user246392

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:46:12