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

时间:2015-01-06 15:24:54

标签: java regex

为什么模式/匹配器与(\\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

2 个答案:

答案 0 :(得分:1)

这是因为.split(String regex)使用正则表达式来标记断开字符串的位置。因此,在您的情况下,如果您有1A2B£$%^&,则会打印1个字符串:£$%^&,因为它会在1A分割,然后再在2B分割,但是,因为那些返回空组,它们被省略,而你只剩下£$%^&

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

答案 1 :(得分:1)

为什么它不起作用

因为吐出会消耗这些字符,并且输出列表中没有剩下的字符

<强>解决方案

不完美,但展望未来会帮助你

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