Pattern/Matcher 与 String.split() 相同的正则表达式

Pattern/Matcher vs String.split() for the same regex

为什么 Pattern/Matcher 可以与 (\d+)([a-zA-Z]+) 一起使用而 String.split() 不能?

例如:

String line = "1A2B";

Pattern p = Pattern.compile("(\d+)([a-zA-Z]+)");
Matcher m = p.matcher(line);
System.out.println(m.groupCount());

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

打印:

2
1A
2B

但是:

    String line = "1A2B";
    String [] arrayOfStrings = line.split("(\d+)([a-zA-Z]+)");
    System.out.println(arrayOfStrings.length);

    for(String elem: arrayOfStrings){
        System.out.println(elem);
    }

仅打印:

0

那是因为.split(String regex)使用了正则表达式来标记在哪里断开字符串。因此,在您的情况下,如果您有 1A2B£$%^&,它将打印 1 个字符串:£$%^&,因为它将在 1A 处拆分,然后在 2B 处再次拆分,但是,由于那些 return 空组,它们被省略,你只剩下 £$%^&.

另一方面,正则表达式的作用是匹配字符串并将它们分组。然后可以在稍后阶段像您一样访问这些组。

为什么没用

因为 spit 会消耗掉那些字符,并且输出列表中没有剩余的字符

解决方案

不完美,但向前看会帮助你

String line = "1A2B";
String [] arrayOfStrings = line.split("(?=\d+[a-zA-Z]+)");
System.out.println(arrayOfStrings.length);

for(String elem: arrayOfStrings){
    System.out.println(elem);

将输出为

3

1A
2B

不完美,因为前瞻将在字符串的开头为真,从而在输出列表中索引 0 处创建一个空字符串。在示例中,您可以看到长度为 3,而我们期望的是 2