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
为什么 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