C#正则表达式匹配不含excludeMe类的所有锚点标签
搞定C#正则匹配不含excludeMe类的锚点标签
我来帮你解决这个正则问题!你需要从一堆锚点标签里精准匹配那些不带excludeMe类的标签,而且已知带这个类的锚点只有这一个类属性,对吧?
你原来的正则@"(<a.*?>.*?</a>)"能匹配所有锚点,但要排除目标标签,关键是用负前瞻在匹配锚点开头的时候就把带excludeMe类的情况排除掉,还要考虑属性的位置可能不固定。
正确的正则表达式
直接给你能用的写法:
@"(<a\s(?!.*?class=""excludeMe""\s?.*?>).*?>.*?</a>)"
为啥这么写?我给你拆解下:
<a\s:先匹配锚点标签的开头,确保后面跟着空白(也就是属性的开始,避免匹配到类似<aFoo>这种奇怪的标签)(?!.*?class=""excludeMe""\s?.*?>):这是核心的负前瞻规则,意思是从当前位置往后找,找不到包含class="excludeMe"的属性直到锚点标签的闭合>,这样就直接排除了所有带这个类的锚点.*?>.*?</a>:这部分和你原来的逻辑一致,用非贪婪匹配.*?来精准匹配单个锚点的内容,避免把多个标签当成一个匹配项
测试示例(C#代码)
你可以直接跑这段代码验证效果:
using System; using System.Text.RegularExpressions; class AnchorMatchTest { static void Main() { string input = @"<a href=""foo.html"" class=""foo"">Foo</a> <a href=""bar.html"" class=""excludeMe"">Bar</a> <a href=""baz.html"" class=""baz"">Baz</a>"; string pattern = @"(<a\s(?!.*?class=""excludeMe""\s?.*?>).*?>.*?</a>)"; foreach (Match match in Regex.Matches(input, pattern)) { Console.WriteLine(match.Value); } } }
运行后会输出两个符合要求的锚点,刚好排除了带excludeMe类的那个:
<a href="foo.html" class="foo">Foo</a> <a href="baz.html" class="baz">Baz</a>
额外扩展(可选)
如果你的场景里锚点的class属性可能用单引号(比如class='excludeMe'),可以把正则改成支持单双引号的版本:
@"(<a\s(?!.*?class=["']excludeMe["']\s?.*?>).*?>.*?</a>)"
内容的提问来源于stack exchange,提问作者J. Hahn
相关产品推荐
相关产品推荐

