7

私のJavaコードでは、文字列入力に上記の特殊文字が含まれている場合、その前に\\

特殊文字セットは{+, -, &&, ||, !, (, ), {, },[, ], ^, "", ~, *, ?, :, \}. 使用してみString.replaceAll(old,new)ましたが、「古い」と「新しい」に適切な値を指定しているにもかかわらず、驚いたことに機能しません。

if old=":",new="\:"

特殊文字を文字列配列に入れ、for ループで反復し、文字列に存在するかどうかを確認し、存在する場合はinput.replaceAll(":","\\:"). しかし、意図した出力が得られません。助けてください

String[] arr = { "+", "-", "&&", "||", "!", "(", ")", "{", "}",
                "[", "]", "^", "\"", "~", "*", "?", ":", "\\", "AND", "OR" };

    for (int i = 0; i < arr.length; i++) {
//'search' is my input string

        if (search.contains((String) arr[i])) {

            String oldString = (String) arr[i];

            String newString = new String("\\" + arr[i]);
            search = search.replaceAll(oldString, newString);
            String newSearch = new String(search.replaceAll(arr[i],
                    newString));


        }
    }
4

4 に答える 4

13

replaceAll が正規表現を取ることに気付いたら、文字を正規表現としてコーディングするだけです。

これを試して:

String newSearch = search.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\-])", "\\\\");

その風変わりな正規表現は「先読み」です-次の文字が何かに一致するという非キャプチャーアサーション-この場合は文字クラスです。

a を除いて、文字クラスの char をエスケープする必要がないことに注意してください](最初または最後であれば、マイナスでもエスケープする必要はありません)。

これ\\\\は、正規表現リテラルをコーディングする方法です\(Javaの場合は1回、正規表現の場合は1回エスケープします)


この動作のテストは次のとおりです。

public static void main(String[] args) {
    String search = "code:xy";
    String newSearch = search.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\-])", "\\\\");
    System.out.println(newSearch);
}

出力:

code\:xy
于 2012-12-04T05:28:59.103 に答える
3

String#replaceAllregex最初のパラメーターとしてを受け取ります。meta-characterそのため、文字列の入力が-のような場合、コードは失敗します+

を使用する必要がありますString#replace

また、最後の割り当ては必要ありません: -

String newSearch = new String(search.replaceAll(arr[i], newString));

として、あなたはそれをまったく使用していません。実際には、変更された文字列を に割り当てているsearchため、必須ではありません。

また、を使用するのではなくnew String(...)、新しい文字列を作成します。実際、必要なのはif-statement.

さて、その説明の後、以下を使用できるようになりましたfor-loop: -

for (int i = 0; i < arr.length; i++) {
    if (search.contains(arr[i])) {
        search = search.replace(arr[i], "\\" + arr[i]);
    }
}
于 2012-12-04T05:13:30.173 に答える
2

以下のものを使用してみてください。ReplaceAllの代わりにreplaceメソッドを使用してください

search = search.replace(oldString、newString);

于 2012-12-04T05:32:13.500 に答える
0

以下のコードを試したところ、うまくいきました

String[] arr = { "+", "-", "&&", "||", "!", "(", ")", "{", "}",
                    "[", "]", "^", "\"", "~", "*", "?", ":", "\\", "AND", "OR" };

        for (int i = 0; i < arr.length; i++) {
    //'search' is my input string

            if (search.contains((String) arr[i])) {

                String oldString = (String) arr[i];

                String newString = new String("\\" + arr[i]);
                search = search.replaceAll(oldString,(String) ("\\" + newString));



            }
        }
于 2012-12-04T06:39:50.233 に答える