Mar*_*cel -2 java string split
我有一个类似"3332255766122"的字符串,我希望在这样的数组中有这样的字符:333,22,55,7,66,1,22
因此,只要出现新字符,就应该将字符串分成几部分.这可能吗?
我当前的方法是检查一个字母,而不是检查下一个字母,如果它们是相等的,也检查下一个字母,依此类推,如果它们不相等,它们先前相等的字母将被添加到列表中.
你可以用split()
一些正则表达式魔法来做到这一点:
System.out.println( Arrays.toString( "3332255766122".split( "(?<=(.))(?!\\1)" ) ));
Run Code Online (Sandbox Code Playgroud)
输出:
[333, 22, 55, 7, 66, 1, 22]
Run Code Online (Sandbox Code Playgroud)
正则表达式细分:
(?<=x)
是一个正的零宽度后视,因此它将匹配子表达式匹配后的位置 x
(.)
因为x
上面的epxression 是一个匹配任何角色的捕获组,并将其捕获到下一步.结合上面的部分,即(?<=(.))
这意味着:"匹配角色后的任何位置并将该角色捕捉到一个群组中"(?!x)
是一个负向前瞻,它匹配任何未跟随子表达式匹配的位置x
.\1
是对第一个捕获组((.)
在本例中)的匹配的反向引用,因此结合上面的部分,即(?!\1)
,匹配任何与之前的字符不匹配的位置在单词中,表达式意味着:"匹配任何未跟随相同字符的字符后的任何位置".
这可能对你有用:
public static void main(String... args) throws Exception {
String s = "3332255766122";
Pattern p = Pattern.compile("(\\d)\\1*");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
}
}
Run Code Online (Sandbox Code Playgroud)
O/P:
333
22
55
7
66
1
22
Run Code Online (Sandbox Code Playgroud)
PS:我认为托马斯的解决方案更好:)