【问题标题】:Java String.split() without specific symbol [closed]没有特定符号的Java String.split() [关闭]
【发布时间】:2015-10-12 11:18:39
【问题描述】:

我有一个像“3332255766122”这样的字符串,我想在这样的数组中拥有它:333,22,55,7,66,1,22

因此,每当出现新字符时,都应将字符串分成几部分。这可能吗?

我目前的方法是检查一个字母,而不是检查下一个,如果它们相等,则检查下一个,依此类推,如果它们不相等,则将它们之前的相等添加到列表中。

【问题讨论】:

  • 是的。可能的。有什么尝试吗?
  • 还没有,平时我用的是String.Split(),但是那里我要加一个代表分隔符的参数,我没有。
  • 您需要创建自己的方法。没那么难。
  • 拆分不起作用。遍历字符串并检查前一个字符,添加分隔符。
  • 您可以通过编辑您的问题以显示您编写的用于拆分的方法,然后询问是否有更好的方法或通过解释它是如何做到这一点来摆脱反对票完成,为什么你不想那样做。现在看起来你根本没有做任何工作,只是要求我们给你代码。

标签: java string split


【解决方案1】:

您可以使用 split() 和一些正则表达式来做到这一点:

System.out.println( Arrays.toString( "3332255766122".split( "(?<=(.))(?!\\1)" ) )); 

输出:

[333, 22, 55, 7, 66, 1, 22]

正则表达式分解:

  • (?&lt;=x) 是一个正的零宽度后视,因此它将匹配子表达式 x 匹配之后的位置
  • (.) as epxression for x 是一个捕获组,它匹配任何字符并将其捕获以用于下一步。结合上面的部分,即(?&lt;=(.))这意味着:“匹配一个字符之后的任何位置并将该字符捕获到一个组中”
  • (?!x) 是一个否定的前瞻,它匹配任何没有被子表达式 x 匹配的位置。
  • \1 是对第一个捕获组的匹配的反向引用(在这种情况下为(.)),因此结合上面的部分,即(?!\1),它匹配任何与之前的字符不匹配的位置

用文字表达的意思是:“匹配任何字符后面的任何位置,但后面不是相同的字符”。

【讨论】:

  • 你能解释一下正则表达式吗?
  • @MuratK 我已经在努力了 :)
  • 我正在尝试"(?&lt;=(.)\\1*)" ...但模式无法编译。它说“后视组在索引 9 附近没有明显的最大长度”。
  • @Pshemo 是的,这就是我用来帮助记忆正确语法的方法。
【解决方案2】:

这可能对你有用:

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());
        }       
    }

O/P:

333
22
55
7
66
1
22

PS : 我认为 Thomas 的 解决方案更好:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多