58

次のコード行があります

String time = "14:35:59.99";
String timeRegex = "(([01][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])(.([0-9]{1,3}))?";
String hours, minutes, seconds, milliSeconds;
Pattern pattern = Pattern.compile(timeRegex);
Matcher matcher = pattern.matcher(time);
if (matcher.matches()) {
    hours = matcher.replaceAll("$1");
    minutes = matcher.replaceAll("$4");
    seconds = matcher.replaceAll("$5");
    milliSeconds = matcher.replaceAll("$7");
}

matcher.replace正規表現グループのメソッドとバックリファレンスを使用して、時間、分、秒、ミリ秒を取得しています。正規表現グループの値を取得するためのより良い方法はありますか?私は試した

hours = matcher.group(1);

ただし、次の例外がスローされます。

java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:477)
    at com.abnamro.cil.test.TimeRegex.main(TimeRegex.java:70)

ここで何かが足りませんか?

4

2 に答える 2

92

を呼び出さないようにすれば、正常に機能しますmatcher.replaceAll。電話をかけるreplaceAllと、以前の一致はすべて忘れられます。

String time = "14:35:59.99";
String timeRegex = "([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:\\.([0-9]{1,3}))?";
Pattern pattern = Pattern.compile(timeRegex);
Matcher matcher = pattern.matcher(time);
if (matcher.matches()) {
    String hours = matcher.group(1);
    String minutes = matcher.group(2);
    String seconds = matcher.group(3);
    String miliSeconds = matcher.group(4);
    System.out.println(hours + ", " + minutes  + ", " + seconds + ", " + miliSeconds);
}

正規表現にもいくつかの改善を加えたことに注意してください。

  • (?: ... )キャプチャすることに興味のないグループには、キャプチャしないグループを使用しました。
  • ドットのみに.一致する任意の文字に一致する文字を変更しました。\\.

オンラインで動作することを確認してください:ideone

于 2012-07-26T09:34:49.997 に答える
20

matcher.find()グループ関数を呼び出す前に使用すると機能します。

于 2012-07-26T09:38:03.853 に答える