0

パターンのある線から数字を取り出したいのですが、思い通りに数字をグループ化できません。

public static void main(String[] args) {
    Pattern pattern = Pattern.compile("(.*?)((\\d+),{0,1}\\s*){7}");
    Scanner in = new Scanner("text: 1, 2, 3, 4, 5, 6, 7"); // new Scanner(new File("data.txt"));
    in.useDelimiter("\n");

    try {
        while(!(in.hasNext(pattern))) {
            //Skip corrupted data
            in.nextLine();
        }
    } catch(NoSuchElementException ex) {
    }
    String line = in.next();
    Matcher m = pattern.matcher(line);
    m.matches();
    int groupCount = m.groupCount();
    for(int i = 1; i <= groupCount; i++) {
        System.out.println("group(" + i + ") = " + m.group(i));
    }
}

出力:

group(1)=テキスト:

group(2)= 7

group(3)= 7

私が取得したいのは:

group(2)= 1

group(3)= 2

..。

group(8)= 7

この1つのパターンからこれを取得できますか、それとも別のパターンを作成する必要がありますか?

4

2 に答える 2

1

単に整数を収集したい場合Matcher.find()は、次のスタイルのパターンを使用するメソッドを使用して、部分文字列を反復処理できます。1)オプションの区切り文字または改行。2)空白で囲まれている可能性のある整数。参照できるのは具体的なキャプチャグループのみであるため、グループインデックスを管理する必要はまったくありません。次のソリューションは、正規表現以外は何も必要とせず、整数を見つけるためにcharシーケンスを繰り返すだけです。

package stackoverflow;

import java.util.ArrayList;
import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.lang.System.out;
import static java.util.regex.Pattern.compile;

public final class Q11599271 {

    private Q11599271() {
    }

    //
    // (2) Let's capture an integer number only     -------------------+
    // (1) Let's assume it can start with a new     ------+            |
    //     line or a comma character                      |            |
    //                                              +-----+-----+    +-+--+
    //                                              |           |    |    |
    private static final Pattern pattern = compile("(?:^\\S+:|,)?\\s*(\\d+)\\s*");

    private static Iterable<String> getOut(CharSequence s) {
        final Collection<String> numbers = new ArrayList<String>();
        final Matcher matcher = pattern.matcher(s);
        while ( matcher.find() ) {
            numbers.add(matcher.group(1));
        }
        return numbers;
    }

    private static void display(Iterable<String> strings) {
        for ( final String s : strings ) {
            out.print(" ");
            out.print(s);
        }
        out.println();
    }

    public static void main(String[] args) {
        display(getOut("text: 1, 2, 3, 4, 5, 6, 7"));
        display(getOut("1, 2, 3, 4, 5, 6, 7"));
        display(getOut("text: 1,  22,  333   , 4444 , 55555 , 666666, 7777777"));
    }

}

これにより、次のようになります。

1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 22 333 4444 55555 666666 7777777
于 2012-07-22T10:25:40.413 に答える
0

それはいけません。グループは常に、正規表現でのキャプチャグループに対応します。つまり、キャプチャグループが1つある場合、一致するグループは複数存在できません。試合中に一部(キャプチャグループでさえ)が繰り返される頻度は関係ありません。式自体は、最終一致が持つことができるグループの数を定義します。

于 2012-07-22T10:17:07.540 に答える