6

我有一个字符串,其中包含一个连续的数字块,然后是一个连续的字符块。我需要将它们分成两部分(一个整数部分和一个字符串)。

我尝试使用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是它的否定。所以这个零匹配断言匹配前面的字符是 digit (?<=\d),后面的字符是 non-digit 的位置(?=\D)

参考

相关问题


使用有限拆分的替代解决方案

以下也有效:

    String[] parts = "123XYZ".split("(?=\\D)", 2);
    System.out.println(parts[0] + "-" + parts[1]);

这在我们看到一个非数字之前就分裂了。这更接近您的原始解决方案,除了因为它实际上不匹配非数字字符,它不会“吃掉它”。此外,它使用limitof 2,这正是你想要的。

API 链接

  • String.split(String regex, int limit)
    • 如果限制n大于零,则该模式将在大多数情况下应用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 回答