6

次の文字列を分割するために単純な分割を使用しようとしています: 00-00000

私の表現は次のとおりです。^([0-9][0-9])(-)([0-9])([0-9])([0-9])([0-9])([0-9])

そして、私の使用法は次のとおりです。

String s = "00-00000";

String pattern = "^([0-9][0-9])(-)([0-9])([0-9])([0-9])([0-9])([0-9])";

String[] parts = s.split(pattern);

Pattern クラスと Matcher クラスをいじってみると、パターンが一致することがわかり、マッチャーは groupCount が 7 であると教えてくれますが、これは正しいことです。しかし、それらを分割しようとすると、うまくいきません。

4

4 に答える 4

9

String.split は、結果としてキャプチャ グループを使用しません。一致するものをすべて見つけて、それを区切り文字として使用します。したがって、結果の String[] は、正規表現が一致する間の部分文字列です。正規表現は文字列全体に一致し、文字列全体を区切り文字として使用すると、他に何も残っていないため、空の配列が返されます。

正規表現キャプチャ グループを使用する場合は、 Matcher.group()を使用する必要がありますが、String.split() は使用しません。

于 2010-06-07T05:13:35.487 に答える
3

あなたの例では、これを簡単に行うことができます:

String s = "00-00000";

String pattern = "-";

String[] parts = s.split(pattern);
于 2010-06-07T05:19:35.760 に答える
1

確かではありませんが、あなたがしようとしているのは、一致した各グループを配列に入れることだと思います。

    Matcher matcher = Pattern.compile(pattern).matcher();

    if (matcher.matches()) {
        String s[] = new String[matcher.groupCount()) {
           for (int i=0;i<matches.groupCount();i++) {
               s[i] = matcher.group(i);
            }
         }
    }
于 2010-06-07T06:32:22.347 に答える
1

ドキュメントから:

String[] split(String regex)--戻り値:この文字列を特定の正規表現に一致するように分割して計算された文字列の配列

基本的に、正規表現は、入力文字列の区切り文字を定義するために使用されます。パターン内でキャプチャ グループと後方参照を使用できますが (ルックアラウンドなど)、最終的に重要なのはパターンが何にどこで一致するかです。

正規表現を使用して元の文字列を 7 つの部分に分割する場合は、次のようにすることができます。

    String s = "12-3456";
    String[] parts = s.split("(?!^)");

    System.out.println(parts.length); // prints "7"

    for (String part : parts) {
        System.out.println("Part [" + part + "]");
    } // prints "[1] [2] [-] [3] [4] [5] [6] "

(?!^)これは、文字列の最初の文字の前を除く任意の場所にあるゼロ長の一致する assertion で分割されます。これにより、空の文字列が配列の最初の要素になることを防ぎ、末尾の空の文字列は既に破棄されていlimitますsplit

ただし、このように正規表現を使用して文字列の個々の文字を取得するのはやり過ぎです。数文字しかない場合、最も簡潔なオプションは次のように使用foreachすることtoCharArray()です。

    for (char ch : "12-3456".toCharArray()) {
        System.out.print("[" + ch + "] ");
    }

文字列が長い場合、これは最も効率的なオプションではありません。


分裂中-

これもあなたが探しているものかもしれません:

    String s = "12-3456";
    String[] parts = s.split("-");

    System.out.println(parts.length); // prints "2"

    for (String part : parts) {
        System.out.print("[" + part + "] ");
    } // prints "[12] [3456] "
于 2010-06-07T06:34:52.720 に答える