将字符串分成两个部分,第一部分为纯数字部分,其余部分为?

时间:2018-12-20 19:32:35

标签: java regex

字符串包含以下内容:

  • 可选的ASCII数字序列。
  • 一系列ASCII小写字母。

我正在尝试在一个可以使用的正则表达式中进行拆分:

String string = "123abc";
var array = string.split(...);
System.out.println(java.util.Arrays.toString(array));
// prints [123, abc]

我最接近的正则表达式如下:

(?<=\d+)

示例:

String string = "123abc";
var array = string.split("(?<=\\d+)");
System.out.println(java.util.Arrays.toString(array));
// prints [1, 2, 3, abc]

从技术上讲,我可以不使用任何正则表达式来执行此操作,但是在这里,使用正则表达式很重要。

一种证明我可以正常执行的解决方案:

String string = "123abc";
int i = 0;
for(; i < string.length() && Character.isDigit(string.charAt(i)); i++)
  ;
String[] array = {
    string.substring(0, i), string.substring(i)
  };
System.out.println(java.util.Arrays.toString(array));
// prints [123, abc]

另一种方法是:

String string = "123abc";
String[] array = {
    string.replaceAll("\\D", ""),
    string.replaceAll("\\d", "")
  };
System.out.println(java.util.Arrays.toString(array));
// prints [123, abc]

匹配示例:

In:                 Out:
123abc              [ "123", "abc" ]
0a                  [ "0", "a" ]
a                   [ "", "a" ]

1 个答案:

答案 0 :(得分:1)

Pattern.split()文档说:

  

如果在输入序列的开头有一个正宽匹配,则在结果数组的开头将包含一个空的前导子字符串。开头的零宽度匹配永远不会产生这样的空前导子字符串。

因此,使用正则表达式可能无法实现您想要的目标。