带前导空格的HTML标签匹配正则问题:两种模式失效原因咨询
搞懂你的正则匹配问题:为什么第一种模式失效?
嘿,我来帮你拆解这个疑惑,核心问题其实出在反向引用的匹配逻辑上,咱们一步步说:
先明确你的测试场景
你用的测试字符串是:
String s = "< pre href = \"dajflka\" >ld fjalj09u293 ^% </pre>";
重点注意:开标签是< pre(<后面带空格),但闭标签是</pre>(标签名pre前面没有空格)。
两种正则的核心差异
第一种(失效的模式)
你的正则补全后大概是这样:
Pattern ptr = Pattern.compile("(<(?<doubletag>[ ]*[a-z]+)([^>]*)>)(.*)(</\\k<doubletag>>)");
这里的坑在于:命名组doubletag把开标签里的前导空格也一起捕获了。放到测试字符串里,它会抓到 pre(前面带空格的标签名)。
而正则里的反向引用\\k<doubletag>是严格匹配捕获到的内容的——它会去闭标签里找 pre(带空格的),但你的闭标签是</pre>,标签名是不带空格的pre,自然匹配不上,整个正则就失效了。
第二种(正常工作的模式)
当你把[ ]*移到<之后、命名组外面,比如:
Pattern ptr = Pattern.compile("(<[ ]*(?<doubletag>[a-z]+)([^>]*)>)(.*)(</\\k<doubletag>>)");
这时候命名组doubletag只捕获纯标签名pre,反向引用去找闭标签里的pre就完全对应上了,所以正则能顺利匹配整个标签内容。
一句话总结
正则的反向引用是「原样匹配捕获到的内容」,第一种模式把前导空格也算进了要引用的标签名里,和闭标签的无空格标签名不匹配;第二种把空格排除在引用内容外,只抓纯标签名,自然就正常啦。
内容的提问来源于stack exchange,提问作者Abdelrahman
相关产品推荐
相关产品推荐

