正则表达式在测试工具中工作,但在生产中不匹配

时间:2015-12-07 05:58:19

标签: 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

1 个答案:

答案 0 :(得分:1)

您的原始Pattern出现问题。如果要在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正在为你逃避反击,但不幸的是它本身有点过于聪明。