匹配非HTML标签内分号的正则仅分行有效,单行失效如何修复?
问题原因
你当前使用的正则/(^|>)[^<>]*?;[^<>]*?(<|$)的核心问题是匹配过程会消耗分界符<和>:
当所有内容在同一行时,第一个符合规则的分号匹配完成后,正则会把本次匹配结尾的<(下一个HTML标签的左尖括号)直接消耗掉,后续的匹配就无法找到对应的>作为起始锚点,因此无法匹配到后面标签外的分号。
解决方案
使用零宽断言改写正则,避免消耗分界符,支持同一行连续匹配:
/(?<=^|>)[^<>]*?;(?=[^<>]*(?:<|$))/g
正则逻辑说明
(?<=^|>):零宽正向后行断言,要求当前位置的前面是字符串开头,或者是HTML标签的结束符>,不消耗该字符[^<>]*?:非贪婪匹配任意不含尖括号的字符;:目标匹配的分号(?=[^<>]*(?:<|$)):零宽正向先行断言,要求分号后面的内容要么到下一个<为止都没有尖括号,要么直接到字符串结尾,不消耗该字符
兼容低版本环境方案
如果运行环境不支持后行断言,可以使用捕获组方案,取第二个分组的内容即可:
/(^|>)([^<>]*?;)(?=[^<>]*(?:<|$))/g
测试验证
针对你提供的同一行测试用例:
Value1;<p style="color:red; font-weight:400;">Value2</p>;<p style="color:red; font-weight:400;">Value3</p>;Value4
上述正则可以正确匹配到3个标签外的分号,不会匹配到HTML标签内部style属性里的分号,也不会匹配到标签包裹内容中的分号。
内容的提问来源于stack exchange,提问作者shivam dixit
相关产品推荐
相关产品推荐

