0

Java コード:

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        String r = "\\bdog\\b";
        Pattern p = Pattern.compile(r);
        String text = "abc dog def";
        System.out.println(p.matcher(text).matches());
    } 
}

同等の Perl コード:

$x = "abc dog def";
if ($x =~ /\bdog\b/) {
    print "matches";
}

Perl コードは期待どおりに動作し、文字列 "abc dog def" が指定された正規表現と一致することを出力します。一方、Java コードは、文字列が正規表現と一致しないことを示しています。私は愚かな間違いを犯していますか?興味深いことに、 Oracle Docsで例示されているように (文字列リテラルではなく) cmd 行に正規表現を入力すると、問題なく動作します。

4

4 に答える 4

1

問題は、matchesの代わりに使用していfindます。Matches は、文字列全体が一致することを期待しています\bdog\bが、明らかにそうではありません。

これはあなたが必要とするものです:

import java.util.regex.*;

class Test {
   public static void main(String[] args) {
      String r = "\\bdog\\b";
      Pattern p = Pattern.compile(r);
      String text = "abc dog def";
      Matcher m = p.matcher(text);
      while(m.find())  {
         System.out.println(m.group());
      }
   }
}

あなたの投稿に作業コードを投稿していただき、ありがとうございます。切り取り、貼り付け、コンパイル、実行するだけで、いじったり、不足している部分を見つけたりする必要はありません。

于 2014-01-22T04:22:12.067 に答える
1

Matcher#matches()状態の javadoc

領域全体をパターンと一致させようとします。

したがって、全体を一致させようとしていますabc dog defPatternがその中に表示されるかどうかを確認しようとしているわけではありませんString。そのために使用Matcher#find()します。

パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。

于 2014-01-22T04:18:49.740 に答える
0

入力の一部を一致させるだけで true になる他のほとんどの言語とは異なり、Java は文字列全体matches()を一致させる必要があるため、perl から Java に変換するには、正規表現の両端に次のように追加するだけです。.*

String text = "abc dog def";
if (text.matches(".*\\bdog\\b.*")) // true
于 2014-01-22T04:22:05.423 に答える