分割后无法显示字符串值

时间:2013-02-05 10:13:58

标签: java

我正在编写一个示例代码,它根据分隔符拆分给定的字符串,并显示最终的字符串集。这是我的代码 -

        String[] arr = null;
        String[] newArr = null;
        String strArr = "adg$dgsd$$$brr$dhr$$$ce$twt$$$dttgdf$gdfg$$$$$";
        for (int i = 0; i < strArr.length(); i++) {
            newArr = strArr.split("\\$\\$\\$\\$");
            for (int j = 0; j < newArr.length; j++) {
                arr = newArr[j].split("\\$\\$");
            }
        }
        System.out.println(strArr);
        System.out.println(newArr[0]);
        System.out.println(arr[0]);
        System.out.println(arr[1]); // throwing exception here
        System.out.println(arr[2]);
        System.out.println(arr[3]);

这是我得到的输出 -

adg$dgsd$$$brr$dhr$$$ce$twt$$$dttgdf$gdfg$$$$$
adg$dgsd$$$brr$dhr$$$ce$twt$$$dttgdf$gdfg

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at ArraySplit.main(ArraySplit.java:20)

这是我期待的输出 -

$adg$dgsd$$$brr$dhr$$$ce$twt$$$dttgdf$gdfg$$$$$
$adg$dgsd$$brr$dhr$$ce$twt$$dttgdf$gdfg
$adg$dgsd
$brr$dhr
$ce$twt
$dttgdf$gdfg$

我观察到的是,如果有2个$符号,因为它与分隔符模式相同,它可以正常工作。但由于中间有3个$符号,我无法显示其余的String对象。关于如何解决这个问题的任何想法? (额外信息:我实际上将此作为在PostGreSQL中传递字符串的一部分作为密码的一部分)

4 个答案:

答案 0 :(得分:3)

  

ADG $ dgsd $$$ BRR $ DHR $$$ CE $ TWT $$$ dttgdf $ gdfg $$$$$

原始数组。

  

ADG $ dgsd $$$ BRR $ DHR $$$ CE $ TWT $$$ dttgdf $ gdfg

$$$$作为一个分隔符,所以newArray的元素将是:adg $ dgsd $$$ brr $ dhr $$$ ce $ twt $$$ dttgdf $ gdfg和$(你有5美元)字符串)

  

$

在最后一个循环中,newArr [j]将为$,分割将生成一个单元素数组,其中包含$。所以arr [0]是$。

  

$

     

$

     

$

与上述相同。显然是OutOfBoundsException。

我认为这个问题的关键是理解String#split本身。看看文档。

以下代码将生成与预期结果类似的输出:

String strArr = "$adg$dgsd$$$brr$dhr$$$ce$twt$$$dttgdf$gdfg$$$$$";
//Print out the string
System.out.println(strArr);
String newArr = strArr.replaceAll("\\$\\$\\$\\$\\$", "");
System.out.println(newArr);
String[] arr = newArr.split("\\$\\$");
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

答案 1 :(得分:1)

您可以看到的结果是上次循环运行后arr s 的状态

也许你想在周期中打印

答案 2 :(得分:0)

String text = "$adg$dgsd$$$brr$dhr$$$ce$twt$$$dttgdf$gdfg$$$$$";
String toArray = text.replaceAll("[\\$]{4}", "");
String[] result = toArray.split("[\\$]{2}");

// just printing
System.out.println(text);
System.out.println(toArray);
for (int i = 0; i < result.length; i++) {
    System.out.println(result[i]);
}

答案 3 :(得分:0)

保留$符号以匹配行尾。您正在使用\ $表达式搜索文字'$'。 所以你的表达式会将字符串分成几部分:

adg$dgsd$$$brr$dhr$$$ce$twt$$$dttgdf$gdfg$$$$$ =  "adg$dgsd$$$brr$dhr$$$ce$twt$$$dttgdf$gdfg" + "$"

由于 $$$$

的出现而分裂

第二个循环会将所有arr0,arr1,arr2,arr3覆盖为$,即第二个分割的字符串。 显然你的替换调用不会做任何事情,因为在第二个拆分字符串中没有匹配$$。