Java String.split()没有特定的符号

Mar*_*cel -2 java string split

我有一个类似"3332255766122"的字符串,我希望在这样的数组中有这样的字符:333,22,55,7,66,1,22

因此,只要出现新字符,就应该将字符串分成几部分.这可能吗?

我当前的方法是检查一个字母,而不是检查下一个字母,如果它们是相等的,也检查下一个字母,依此类推,如果它们不相等,它们先前相等的字母将被添加到列表中.

Tho*_*mas 8

你可以用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),匹配任何与之前的字符不匹配的位置

在单词中,表达式意味着:"匹配任何未跟随相同字符的字符后的任何位置".


The*_*ind 5

这可能对你有用:

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:我认为托马斯的解决方案更好:)