java - 正则表达式在测试工具中有效,但在生产环境中不匹配

标签 java regex

我已经为 Q\|\d\|\^(.+?) 下面的行编写了一个正则表达式 它在测试环境中有效,但在真实环境中无效。

--lines I'm trying to match

String line="XYZ Q|1|^123456<CR> bla bla"

String line="ETC Q|1|^ALL<CR> bla bla"

String line="ABCQ|1|^ALL<CR>123etc"

Pattern queryRegex=Pattern.compile("Q\\\\|\\\\d\\\\|(.+?)<CR>")

Matcher queryMatcher=queryRegex.matcher(line);
queryMatcher.find() returns false ?

queryMatcher.matches()queryMatcher.find() 返回 false,但它适用于测试环境。

有什么想法吗?

编辑: 您可以在测试环境中看到它是如何工作的。右上角有一个复制按钮,它可以将您的模式复制为java代码。

enter image description here

最佳答案

您的原始模式存在问题。当你想在Java中转义一个特殊的正则表达式字符时,你需要转义一次,但实际上你需要两个反斜杠(\\)。第一个反斜杠转义了第二个反斜杠。您实际上使用了四个反斜杠,这就是您没有匹配任何内容的原因。尝试以下代码:

String line = "XYZ Q|1|^123456<CR>";
Pattern queryRegex=Pattern.compile("Q\\|\\d\\|(.+?)<CR>");

Matcher queryMatcher=queryRegex.matcher(line);
if (queryMatcher.find()) {
    System.out.println("Group 0: " + queryMatcher.group(0));
    System.out.println("Group 1: " + queryMatcher.group(1));
}

输出:

Group 0: Q|1|^123456<CR>
Group 1: ^123456

至于为什么它在你的测试环境中工作(你从来没有提到这是在哪里),我只能猜测,额外的反斜杠可能是在剪切并粘贴到你的IDE时引入的。您的 IDE 正在为您转义反斜杠,但不幸的是它本身有点太聪明了。

关于java - 正则表达式在测试工具中有效,但在生产环境中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34127353/

相关文章:

java - Jackson 在 OracleResultSet 的数值周围加上引号

java - 并发模式失败的问题

java - 您能解释一下 Java 正则表达式中的这个命名组起始位置吗?

java - 查找 ArrayList 的大小,其中列表名称作为字符串传递

java - 为什么需要 PrintWriter?

java - 使用正则表达式将字符串大写

java ;字符串替换全部给出错误

python - 命名实体识别(地点的正则表达式)

C# - 图片问题

Ruby Regex 从电子邮件地址中提取域