繁体   English   中英

相同正则表达式的Pattern / Matcher vs 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处再次拆分,但是,由于这些返回空组,因此将它们省略并您只剩下£$%^&

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

为什么它不起作用

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

并不完美,但展望未来将为您提供帮助

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM