1

私は文字列を持っています:

    String myString1 = "22223 2342 1 98 333 3 665"

    String myString2 = "22323 3 222 34 33 1 98"

1桁、スペース、2桁の値のみを抽出したいと思います。

    private static final Pattern p3DigitsGap = Pattern.compile(".*\\b\\d\\s\\d{2}\\b.*");

上記の両方の文字列で、「1 98」を抽出しようとしています。パターンが文字列の最後にある場合、どちらかの側を空白で分割することはできません。

        Matcher matcher = p3DigitsGap.matcher(myString1);
        if (matcher.find()) {
            Log.i("Matcher found");
            while (matcher.find() == true) {
                Log.i("Matcher is true");
                String extract = matcher.group(1);
                Log.d("extract: " + extract);
            }
        }

whileループを削除すると、文字列抽出が読み込まれることはなく、範囲外の例外がスローされます。whileループに追加しましたが、matcher.find()がtrueに等しくありません。

パターンを次のように交換してみました:

    Pattern p3DigitsGap = Pattern.compile("[^0-9a-z]\\d\\s\\d{2}[^0-9a-z]");

。*\\bを使用すると問題が発生する可能性があると思いましたが、同じ結果が得られます。

誰かが私がどこで間違っているのか理解するのを手伝ってくれませんか。

前もって感謝します。

回答の編集:上記の正規表現を持つグループを使用して機能するため、Reimeusによる回答を正しいとマークしました。私の元の正規表現を改善する代替ソリューションについては、TimPietzckerによる回答も参照してください。

4

3 に答える 3

2

照合するときにグループを使用する方がよいので、次を使用できます。

Pattern p3DigitsGap = Pattern.compile(".*\\b(\\d\\s\\d{2})\\b.*");
Matcher matcher = p3DigitsGap.matcher(myString1);
if (matcher.find()) {
   Log.i("Matcher is true");
   String extract = matcher.group(1);
   Log.d("extract: " + extract);
}
于 2012-09-28T11:02:19.527 に答える
1

2つの問題:

  • 正規表現にキャプチャグループがないため、一致するものの中で最も有効なグループは.group(0)(一致全体)になります。

  • サンプルの文字列は正確に1回一致しますがmatcher.find()、2回呼び出すため、(whileループ内の)2番目の呼び出しは一致を返しません。

これを試して:

Pattern p3DigitsGap = Pattern.compile("\\b\\d\\s\\d{2}\\b");
Matcher matcher = p3DigitsGap.matcher(myString1);
if (matcher.find()) {
    Log.i("Matcher found");
    String extract = matcher.group(0);
    Log.d("extract: " + extract);
}
于 2012-09-28T11:00:57.293 に答える
1

グループが定義されていません。を使用してグループを定義でき( and )ます。コードは次のようになります。

 private static final Pattern p3DigitsGap = Pattern.compile("\\b\\d\\s\\d{2}\\b");
 Matcher matcher = p3DigitsGap.matcher(myString1);
 while (matcher.find()) {
   Log.i("Matcher is true");
   String extract = matcher.group(0);
   Log.d("extract: " + extract);
 }
于 2012-09-28T11:05:24.743 に答える