1

我创建了一个完美的正则表达式模式,但我无法让它在 Java 中工作:

(\\"|[^" ])+|"(\\"|[^"])*"

应用于

robocopy "C:\test" "C:\test2" /R:0 /MIR /NP

给(应该)

[0] => robocopy
[1] => "C:\test"
[2] => "C:\test2"
[3] => /R:0
[4] => /MIR
[5] => /NP

根据http://myregextester.com/index.php在第 0 组

现在,我如何在 Java 中获得这 6 个值?我试过

Pattern p = Pattern.compile("   (\\\"|[^\" ])+  |  \"(\\\"|[^\"])*\"   "); 
Matcher m = p.matcher(command);

System.out.println(m.matches()); // returns false

但模式甚至根本不匹配任何东西?

更新原来的 perl 正则表达式是:

(\\"|[^" ])+|"(\\"|[^"])*"
4

3 回答 3

2

matches()方法将整个字符串与正则表达式匹配 - 仅当整个字符串匹配时才返回 true

您正在寻找的是find()方法,并使用该group()方法获取子字符串。

它通常通过迭代来完成:

while (m.find()) { 
  .... = m.group();
  //post processing
}
于 2012-08-26T13:19:22.153 回答
2

由于正则表达式字符串在进入正则表达式处理器之前首先由编译器处理,因此您需要将表达式中的每个反斜杠加倍,并为每个双引号添加额外的斜杠。

 Pattern p = Pattern.compile("(\\\\\"|[^\" ])+|\"(\\\\\"|[^\"])*\""); 
于 2012-08-26T13:20:44.690 回答
0

matches() 尝试匹配整个字符串上的模式。您应该find()为您的案例使用 Matcher 对象的方法。

所以解决方案是:

System.out.println(m.find());
于 2012-08-26T13:22:35.313 回答