3

java.util.regex のパターン マッチャーを使用して一部の正規表現を機能させるのに問題があります。次の表現があります。

(?=^.{1,6}$)(?=^\d{1,5}(,\d{1,3})?$)

次の文字列に対して一致をテストします。

12345  (match OK)
123456 (no match)
123,12 (match OK)

次のサイトでテストしたところ、完全に機能しているようです。

http://rubular.com、わかりました

http://www.regextester.com/、わかりました

http://myregextester.com/index.php、わかりました

ただし、Javaプログラムの何かと一致するようには見えません。また、オンラインの Java 正規表現テスターでも同じ結果が得られます (一致なし)。

http://www.regexplanet.com/advanced/java/index.html 一致しない ???

これを Java で動作させることができない理由はわかりませんが、他の多くの正規表現エンジンでは動作するようです。

編集:これは機能しないコードでした。タイプミスを許してください、コードPCからスタックオーバーフローにコピー/貼り付けできません。

String inputStr = "12345";
String pattern = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$)";
Pattern regexp = Pattern.compile(pattern);
System.out.println("Matches? "+regexp.matcher(inputStr).matches());
System.out.println(inputStr.matches(pattern));
4

3 に答える 3

2

正しく動作しています。おそらく、正規表現が文字列全体と一致して消費するmatches()ことを期待するメソッドを使用しています。正規表現は、ほんの2、3の先読みであるため、何も消費しません。RegexPlanetサイトで、列を見ると、期待する結果が表示されます。Javaコードでは、Matcherオブジェクトを作成して、そのメソッドを使用できるようにする必要があります。find()find()

于 2012-07-19T09:37:38.787 に答える
2

まず\、パターン内の s をエスケープする必要があります。次に を使用するmatches()と、Java は文字列全体と照合しようとするため、2 番目の先読みを削除するか.*末尾に a を追加しない限り、false が返されます。

これにより、Java で正しい出力が生成されます。

    String regex = "(?=^.{1,6}$)^\\d{1,5}(,\\d{1,3})?$";
    System.out.println("12345".matches(regex)); 
    System.out.println("123456".matches(regex)); 
    System.out.println("123,12".matches(regex));

次の表現も同様です。

    String regex = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$).*";
于 2012-07-19T09:19:04.813 に答える
1

ツールの違いは、ある場合には一致を見つけようとし、別の場合には文字列全体を一致させようとすることです。Java で string.matches(regex) を使用すると、文字列全体が先読み式と一致しないため、すべての入力に対して false が返されます。.*Keppil が示唆するようにa を追加するか、Matcher クラスを使用します。

Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(text);
if(matcher.find()) {
    System.out.println("Match found");
}
于 2012-07-19T09:26:38.060 に答える