1

のような正規表現があります\D*(\d*).*。それが意味することは、それが見つけた最初の番号を取得し、それを最初のキャプチャグループに保存することです。しかし、のような文字列をフィードすると、testing123一致しません!これはしばらくの間私を混乱させてきました。なぜ一致しないのですか?

Javaコード:

String s = "testing123"
Pattern p = Pattern.compile("\\D*(\\d*).*");
Matcher m = p.matcher(s);
//m did not match anything
4

2 に答える 2

5

Matcherオブジェクトを誤って使用していると思います:

if (m.find()) {
    System.out.println(m.group(1));
}

プリント123

ideoneへのリンク)。

于 2012-11-12T01:28:00.683 に答える
0

正規表現を簡素化する

あなたの表現は:

\ D *(\ d *)。*

これの意味は:

  1. 数字以外の0文字以上...
  2. それに続く0桁以上...
  3. その後に0個以上の文字が続きます。

構文の問題は別として、これは不必要な複雑さのようです。行の数字を一致させるには、数字をキャプチャするだけではどうでしょうか。例えば:

\d+

または、単語の境界の終わりに数字だけがあることを確認したい場合は、次のようになります。

\d+\b

PCRE互換エンジンで問題なく動作します。group(0)Javaでは、これにより、部分式をキャプチャする必要なしに、一貫して「123」が配置されます。

于 2012-11-12T01:36:55.140 に答える