首页 > 解决方案 > 正则表达式否定运算符在 java 版本中的工作方式不同

问题描述

我遇到了从 java 8 到 11 的回车 durnig 代码迁移的正则表达式否定运算符问题。
简单的问题:有一个标签正则表达式模式:

Pattern regex = Pattern.compile("<(\\w+)>([^<]*?)</\\1>", Pattern.CANON_EQ);  // pattern for "<tag>...</tag>"
Matcher regexMatcher = regex.matcher("<a>bla\\r\\nbla</a>");
if (regexMatcher.find()) {
...
}

它在 java 8 中工作。(它在输入中找到模式。)

在java 11中它没有。仅当我删除标志 Pattern.CANON_EQ,或将正则表达式修改为正模式时,例如:

"<(\\w+)>(.*?)</\\1>" with Pattern.DOTALL

关键部分是输入中的“\r”。它会导致问题:如果它不在输入中,它也适用于 java 11。

为什么?

标签: javaregexregex-negation

解决方案


推荐阅读