0

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

        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

4 回答 4

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]);
}
于 2013-02-05T10:32:25.430 回答
1

可以看到的结果是最后一次循环运行后arrs的状态。

也许您想在循环中打印它们。

于 2013-02-05T10:19:38.513 回答
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]);
}
于 2013-02-05T10:24:52.827 回答
0

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

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

因发生$$$$而分裂

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

于 2013-02-05T10:49:09.970 回答