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

Java 相同正则表达式的Pattern/Matcher vs String.split(),java,regex,Java,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.grou

为什么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
但是:

仅打印:

0

这是因为
.split(String regex)
使用正则表达式标记在何处断开字符串。因此,在您的例子中,如果您有
1A2B$%^&
,它将打印1个字符串:
$%^&
,因为它将在
1A
处拆分,然后在
2B
处再次拆分,但是,由于这些返回的是空组,因此它们将被忽略,只剩下
$%^&


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

为什么它不起作用

因为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,在
split
的情况下,正则表达式是一个分隔符,而在matcher的情况下,它是一个用于匹配您选择的表达式的“模式”…您想根据什么进行拆分?只需拆分为(数字+字母)组。但是为什么我不能对String.split()使用相同的正则表达式呢?对不起,我的错。谢谢:)
3

1A
2B