我正在编写一个示例代码,它根据分隔符拆分给定的字符串,并显示最终的字符串集。这是我的代码 -
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中传递字符串的一部分作为密码的一部分)
答案 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覆盖为$,即第二个分割的字符串。 显然你的替换调用不会做任何事情,因为在第二个拆分字符串中没有匹配$$。