2

正規表現を使用して、1 つの完全な文字列を 2 つ取得しようとしています。http://gskinner.com/RegExr/で正常に動作する正規表現を取得しました

サンプル文字列は次のとおりです。

Regex is fun when it works 99

これが私の正規表現です

(.*)\\s+(\\d+)$

これらは、Java のマッチャー (matches()) とパターンを使用するときに取得するグループです。

1: Regex is fun when it works 99
2: Regex is fun when it works

(RegExr で) 通常の正規表現を使用すると、実際に期待する結果が得られます。

1: Regex is fun when it works
2: 99

Regex を Java に組み込む際に注意する必要のある注意事項はありますか? 特殊文字用に既に \\ があります。使い方にコツがあるのか​​もしれません。?

サンプル アプリをコピーして貼り付ける場合:

String str = "Regex is fun when it works 33";
String regx = "(.*)\\s+(\\d+)$"

Pattern p = Pattern.compile(regx);
Matcher m = p.matcher(str);

if (m.matches()) {
   for (int i = 0; i < m.groupCount(); i++) {
      System.out.println(i + ": " + m.group(i));
   }
}
4

2 に答える 2

3

99期待した結果が得られない理由は、マッチ全体group(0)が にカウントされないためです。groupcount()そのため、forループの救済が早すぎます。

したがって、に変更i < m.groupCount()するi <= m.groupCount()と、

0: 正規表現は動くと楽しい 99
1: 正規表現は動くと楽しい
2: 99

于 2013-04-14T09:16:50.480 に答える
3

次のように、最初のキャプチャを非貪欲に変更します。

(.*?)\\s+(\\d+)$

この正規表現チュートリアルの「貪欲に気を?つけろ」を参照してください。つまり、できるだけ早く文字の消費を停止します。*

于 2013-04-14T08:13:05.510 に答える