C#正则表达式仅匹配两组之一,为何无法移除末尾单个短横?
问题原因分析
你的正则表达式没覆盖行尾单个-的情况,具体问题出在两个匹配分支上:
- 第一个分支
(\s-\s\s-\s):只能匹配连续的- -(两个减号中间夹两个空格),正好对应第三种输入的结尾,所以能被移除。 - 第二个分支
(\s-\s[^a-zA-Z]):要求-后面必须跟着一个非字母字符,但第一种输入的-直接位于行尾,后面没有任何字符(或只有换行符,不在匹配范围内),所以这个分支无法命中,自然没法移除末尾的单个-。
修正方案
你需要匹配行尾的一个或多个-序列,不管是单个还是多个。把正则改成@"(?:\s-\s)+$"即可,它会精准匹配行尾所有连续的-并替换为空。
修正后的C#代码:
foreach (var item in menuItems) { item.NameWithParents = Regex.Replace(item.NameWithParents, @"(?:\s-\s)+$", string.Empty); }
如果你的每个条目可能包含多行,建议加上RegexOptions.Multiline参数,确保匹配每一行的结尾:
foreach (var item in menuItems) { item.NameWithParents = Regex.Replace(item.NameWithParents, @"(?:\s-\s)+$", string.Empty, RegexOptions.Multiline); }
测试后三种输入的输出会变成:
Test Section - Main Series Test 2 Section - Test Section - Main Seris Main Series
内容的提问来源于stack exchange,提问作者Matthew Verstraete
相关产品推荐
相关产品推荐

