9

文字グループと数字グループを連結した "11E12C108N" のような文字列がある場合、間に区切りスペース文字を入れずにそれらを分割するにはどうすればよいですか?

たとえば、結果の分割を次のようにします。

tokens[0] = "11"
tokens[1] = "E"
tokens[2] = "12"
tokens[3] = "C"
tokens[4] = "108"
tokens[5] = "N"

私は今これを持っています。

public static void main(String[] args) {

    String stringToSplit = "11E12C108N";

    Pattern pattern = Pattern.compile("\\d+\\D+");
    Matcher matcher = pattern.matcher(stringToSplit);

    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

それは私に与えます:

11E
12C
108N

元の正規表現を一度に完全に分割することはできますか? 中間トークンで正規表現を再度実行する代わりに?

4

2 に答える 2

12

次の正規表現を使用して、すべての一致のリストを取得します。それがあなたが探しているものです。

\d+|\D+

Java では、コードは次のようになると思います。

Matcher matcher = Pattern.compile("\\d+|\\D+").matcher(theString);
while (matcher.find())
{
    // append matcher.group() to your list
}
于 2012-06-27T18:36:17.187 に答える
5

分割正規表現で「見回す」を使用することもできます

String stringToSplit = "11E12C108N";
String[] tokens = stringToSplit .split("(?<=\\d)(?=\\D)|(?=\\d)(?<=\\D)");
System.out.println(Arrays.toString(tokens));

アウト [11, E, 12, C, 108, N]

\dアイデアは、数字( )と非数字()の間の場所に分割すること\Dです。言い換えれば、次のような場所(空の文字列)です。

  • (?<=\d)の桁と後の桁以外(?=\D)
  • 前の(?<=\D)数字と後の数字(?=\d)

詳細については(?<=..)http://www.regular-expressions.info/lookaround.html(?=..)をご覧ください。

于 2012-06-27T18:54:41.767 に答える