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 の要素は次のようになります。

$

最後のループでは、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

表示される結果は、最後のサイクル実行後のarrのステータスです。

おそらくあなたはそれらをサイクルで印刷したいと思うでしょう。

于 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" + "$"

$$$$の出現により分割

2 番目のループは、すべての arr0、arr1、arr2、arr3 を、2 番目に分割された文字列である $ に上書きします。明らかに、2 番目に分割された文字列に $$ に一致するものがないため、replace 呼び出しは何もしません。

于 2013-02-05T10:49:09.970 に答える