.NET正则匹配:仅匹配以&结尾且中间无,/&的行
搞定.NET正则匹配需求:精准定位目标行
先明确你的核心需求:要匹配**以&结尾,且中间内容完全不含逗号(,)或&**的行。先把你给出的测试行列出来,方便对照:
- 期望匹配:
a b c & - 不匹配:
a, b, c, &、a & b, c &、a & b
先分析你之前尝试的问题
- 用
^(?!.*,).*&.*$时,匹配到了a b c &和a & b:- 这个正则只排除了逗号,但没限制中间不能有
&;而且.*&.*$的写法允许&出现在行的任意位置,不是必须在结尾,所以a & b(包含&但不在结尾)也被误匹配了。
- 这个正则只排除了逗号,但没限制中间不能有
- 用
^(?!.*(,|&)).*&.*$时完全无匹配:- 这个前置断言
(?!.*(,|&))直接排除了所有包含&的行,但我们要的行本身结尾就是&,自然会被过滤掉,肯定匹配不到。
- 这个前置断言
正确的正则表达式
直接用这个简洁高效的写法就可以:
^[^,&]*&$
拆解一下这个正则的逻辑
^:锚定到行的开头,确保从行首开始匹配[^,&]*:匹配任意数量(0个或多个)**不是逗号和&**的字符,这就彻底保证了中间内容不会出现你要排除的两个符号&$:锚定到行的结尾,确保行必须以&结束
验证测试行
a b c &:中间只有空格和字母,不含逗号/&,且以&结尾 → 匹配成功a, b, c, &:中间有逗号 →[^,&]*在第一个逗号处就停止匹配,后续内容不满足 → 不匹配a & b, c &:中间有&和逗号 → 直接被[^,&]*排除 → 不匹配a & b:不是以&结尾 → 不匹配
如果你偏好使用前置断言的写法(虽然没必要,但可以参考),也可以写成:
^(?!.*(,|&)(?!$)).*&$
这个断言的意思是:行内不能有逗号,也不能有不在结尾的&,最后再确保行以&结尾。不过还是第一个写法更直观高效。
内容的提问来源于stack exchange,提问作者Vince Orio
相关产品推荐
相关产品推荐

