java - 为什么正则表达式仅在存在其他字符串时匹配字符串?

标签 java regex

我有一个 HTML 结束标记白名单(brbidiv): -

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/

相关文章:

python - 在此服务器上找不到请求的 URL django

java - 关于使用 Regex 和 Java 解析 HTML 的问题

java - @Rule 是做什么的?

java - 使用 Gson 解析带对象的 JSON 但需要排除数组

regex - grep命令linux正则表达式

java - 重写 RegEx 以在 Java 中使用

regex - 如何使用 excel 正则表达式从字符串中提取广告尺寸

java - 使用 eclipse 在 Weblogic 中热重载 .js 文件

java - 与静态变量不同,为什么我们不能在声明局部变量之前对其进行初始化?

java - 使用 PMD 识别 java 代码中未关闭的连接