6

連続した数字のチャンクと連続した文字のチャンクを含む文字列があります。それらを 2 つの部分 (1 つの整数部分と 1 つの文字列) に分割する必要があります。

を使ってみString.split("\\D", 1)たのですが、最初の文字を食い尽くしています。すべての String API をチェックしましたが、適切なメソッドが見つかりませんでした。

これを行う方法はありますか?

4

2 に答える 2

14

ルックアラウンドを使用します。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]);

これは、非数字が表示される直前に分割されます。これは、実際には数字以外の文字と一致しないため、「食べ尽くす」ことはないことを除いて、元のソリューションにはるかに近いものです。また、実際に必要なのはlimitof2を使用します。

API リンク

  • String.split(String regex, int limit)
    • 制限nが 0 より大きい場合、パターンはほとんどの場合適用されn - 1、配列の長さは をn超えず、配列の最後のエントリには、最後に一致した区切り文字を超えるすべての入力が含まれます。
于 2010-06-08T08:01:21.470 に答える
3

常に昔ながらの方法があります。

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)};
}

(数字のみまたは文字のみの文字列でも機能することを願っています-ここではテストできません-そうでない場合は、一般的な考えとしてそれを取ってください)

于 2010-06-08T08:23:35.770 に答える