我有一个 HTML 结束标记白名单(br
、b
、i
、div
): -
String whitelist = "([^br|^b|^i|^div])";
String endTagPattern = "(<[ ]*/[ ]*)" + whitelist + "(>?).*?([^>]+>)";
...
html = html.replaceAll(endTagPattern, "[r]");
这需要我的测试String
并删除那些不在白名单中的结束标签,在本例中为了清楚起见替换为[r]
:-
1. <b>bold</b>, 2. <i>italic</i>, 3. <strong>strong</strong>, 4. <div>div</div>, 5. <script lang='test'>script</script>
1. <b>bold</b>, 2. <i>italic</i>, 3. <strong>strong[r], 4. <div>div</div>, 5. <script lang='test'>script[r]
如果我将 strong
添加到此白名单
String whitelist = "([^br|^b|^i|^div|^strong])";
它不仅不匹配 strong
结束标记,还停止匹配结束 script
标记或任何其他相关标记。
我的问题是,为什么?
最佳答案
原因是您正在使用字符类。在字符类中,字符的顺序并不重要,除非您正在处理字符范围。
因此,[^br|^b|^i|^div|^strong]
实际上会匹配除以下字符之外的任何字符:
bridvstrong|^
[请注意,|
和 ^
也在那里]。
您可以使用[^bridvstrong|^]
,它的行为方式相同。
您可能会考虑负面前瞻。
关于java - 为什么正则表达式仅在存在其他字符串时匹配字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906564/