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

正規表現文字列は、正規表現プロセッサに到達する前にコンパイラによって最初に処理されるため、式のすべてのバックスラを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 に答える