1

xyz213123kop234430099kpf4532文字列をトークンに分割しようとしている間:

xyz213123
kop234430099
kpf4532

次のコードを書きました

String s = "xyz213123kop234430099kpf4532";
String regex = "/^[a-zA-z]+[0-9]+$/";
String tokens[] = s.split(regex);
for(String t : tokens) {
    System.out.println(t);
}

ただし、トークンの代わりに、文字列全体を 1 つの出力として取得します。使用した正規表現の何が問題になっていますか?

4

4 に答える 4

3

出来るよ:

String s = "xyz213123kop234430099kpf4532";
String[] result = s.split("(?<=[0-9])(?=[a-z])");

アイデアは、ゼロ幅アサーションを使用して文字列を切り取る場所を見つけることです。次に、後読み (数字が前にある[0-9]) と先読み (後に文字が続き[a-z]ます) を使用します。

これらのルックアラウンドは単なるチェックであり、何も一致しないため、分割の区切り文字は空の文字列であり、結果から文字は削除されません。

于 2013-10-30T02:13:19.190 に答える
2

この一致を数値と非数値に分けることができます。

String s = "xyz213123kop234430099kpf4532";
String[] parts = s.split("(?<![^\\d])(?=\\D)");
for (String p : parts) {
   System.out.println(p);
}

出力

xyz213123
kop234430099
kpf4532
于 2013-10-30T02:17:16.333 に答える
1

あなたはそのために使いたくありませんsplit。への引数splitは、トークン間の区切り文字です。あなたはそれを持っていません。代わりに、繰り返されるパターンがあり、各パターンに一致する必要があります。代わりにこれを試してください:

String s = "xyz213123kop234430099kpf4532";
Pattern p = Pattern.compile("([a-zA-z]+[0-9]+)");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group());
}

出力:

xyz213123
kop234430099
kpf4532

(投稿された質問のように、2番目のトークンが「3kop234430099」になるロジックはわかりません。先頭の「3」はタイプミスだと思います。)

于 2013-10-30T01:51:27.507 に答える
1

式は ^ (文字列の先頭) で始まり $ (文字列の末尾) で終わるため、正規表現に一致する文字列はありません。したがって、文字列全体に一致するか、まったく一致しません。しかし、文字列と一致しないため、文字列をトークンに分割しても見つかりません。そのため、大きなトークンを 1 つだけ取得できます。

于 2013-10-30T01:45:34.630 に答える