連続した数字のチャンクと連続した文字のチャンクを含む文字列があります。それらを 2 つの部分 (1 つの整数部分と 1 つの文字列) に分割する必要があります。
を使ってみString.split("\\D", 1)
たのですが、最初の文字を食い尽くしています。すべての String API をチェックしましたが、適切なメソッドが見つかりませんでした。
これを行う方法はありますか?
連続した数字のチャンクと連続した文字のチャンクを含む文字列があります。それらを 2 つの部分 (1 つの整数部分と 1 つの文字列) に分割する必要があります。
を使ってみString.split("\\D", 1)
たのですが、最初の文字を食い尽くしています。すべての String API をチェックしましたが、適切なメソッドが見つかりませんでした。
これを行う方法はありますか?
ルックアラウンドを使用します。str.split("(?<=\\d)(?=\\D)")
String[] parts = "123XYZ".split("(?<=\\d)(?=\\D)");
System.out.println(parts[0] + "-" + parts[1]);
// prints "123-XYZ"
\d
数字の文字クラスです。\D
はその否定です。したがって、このゼロ一致アサーションは、前の文字が数字(?<=\d)
で、次の文字が非数字である位置に一致し(?=\D)
ます。
以下も機能します。
String[] parts = "123XYZ".split("(?=\\D)", 2);
System.out.println(parts[0] + "-" + parts[1]);
これは、非数字が表示される直前に分割されます。これは、実際には数字以外の文字と一致しないため、「食べ尽くす」ことはないことを除いて、元のソリューションにはるかに近いものです。また、実際に必要なのはlimit
of2
を使用します。
String.split(String regex, int limit)
n
が 0 より大きい場合、パターンはほとんどの場合適用されn - 1
、配列の長さは をn
超えず、配列の最後のエントリには、最後に一致した区切り文字を超えるすべての入力が含まれます。常に昔ながらの方法があります。
private String[] split(String in) {
int indexOfFirstChar = 0;
for (char c : in.toCharArray()) {
if (Character.isDigit(c)) {
indexOfFirstChar++;
} else {
break;
}
}
return new String[]{in.substring(0,indexOfFirstChar), in.substring(indexOfFirstChar)};
}
(数字のみまたは文字のみの文字列でも機能することを願っています-ここではテストできません-そうでない場合は、一般的な考えとしてそれを取ってください)