.NET正则表达式中$限定符的异常行为咨询
为什么你的$限定符没按预期工作?
咱们先把核心误解点说清楚:RegexOptions.Multiline模式下的$,只认换行符(\n)界定的行尾,不是你以为的空格、连字符分隔的"内容末尾"。
你的输入字符串是:
var text = @"_ abc 123 do-re-me";
这里面没有任何\n换行符,所以整个字符串就是实打实的"一行"——Multiline模式根本没机会发挥作用,$自然只会匹配整个字符串的最后位置,也就是你看到的"me"。
验证:加个换行符就符合预期了
要是把文本改成每行一个内容:
var text = @"_ abc 123 do-re-me";
再跑你原来的代码(带着RegexOptions.Multiline),你就能得到预期的结果:
0. _ 1. abc 2. 123 3. me
这时候Multiline模式才真正生效,$匹配了每个\n之前的行尾位置。
你混淆了"行尾"的定义
你之前误以为空格、连字符分隔的部分是"行",但Multiline模式里的"行"是严格靠换行符划分的,这是最关键的误解。
至于你说的行为符合预期,应该是你之前测试的时候用了带换行的字符串,所以^匹配了每行开头——这完全符合Multiline模式的设计逻辑。
要是想匹配非换行分隔的"单词末尾"
如果你的实际需求是抓出被空格、连字符这类符号分隔的每个单词,那别用$了,改用**单词边界\b**更合适,比如把正则改成:
var pat = @"\w+\b"; var re = new Regex(pat); // 根本不需要Multiline模式
这样就能匹配到_、abc、123、do、re、me。如果只想抓每个分隔块的最后一个单词(比如do-re-me里的me),可以再调整正则逻辑,比如用(?<=[\s-])\w+$这类环视规则,具体看你实际要处理的文本格式。
内容的提问来源于stack exchange,提问作者AviFarah
相关产品推荐
相关产品推荐

