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