我为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代码模式。
答案 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正在为你逃避反击,但不幸的是它本身有点过于聪明。