web-dev-qa-db-ja.com

文字列の特殊文字の前にエスケープ「\」を追加します

単純なSQLクエリがあり、クエリが現在のフィールドのいずれかに一致するかどうかを確認します。このためにLIKEステートメントを使用しています。フィールドの1つに特殊文字を含めることができ、検索クエリにも特殊文字を含めることができます。そのため、特殊文字の前に「\」をエスケープする必要があるソリューションを探しています。

query = "hello+Search}query"

に変更するには上記が必要です

query = "hello\+Search\}query"

各特殊文字を個別に検索して「\」を追加する以外に、これを行う簡単な方法はありますか?エスケープ文字がないとエラーメッセージが表示されるため

Java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0

前もって感謝します

8
Visahan

エスケープする特殊文字を決定し、単に呼び出す

_query.replace("}", "\\}")
_

許可するすべての特殊文字をいくつかの配列に保持し、それを反復して、例示されているように出現を置き換えることができます。このメソッドは、すべての 正規表現メタ文字 を置き換えます。

_public String escapeMetaCharacters(String inputString){
    final String[] metaCharacters = {"\\","^","$","{","}","[","]","(",")",".","*","+","?","|","<",">","-","&","%"};

    for (int i = 0 ; i < metaCharacters.length ; i++){
        if(inputString.contains(metaCharacters[i])){
            inputString = inputString.replace(metaCharacters[i],"\\"+metaCharacters[i]);
        }
    }
    return inputString;
}
_

query=escapeMetaCharacters(query);として使用できます。見つけたライブラリがそれ以上のことをするとは思わないでください。せいぜいspecialCharactersの完全なリストを定義します。

15
Laurentiu L.

\\を使用して文字列リテラルに\を導入する必要があります。つまり、エスケープ the \にする必要があります。 (単一のバックスラッシュを使用して、特殊文字を文字列に導入します。たとえば、\tはタブです。)

query = "hello\\+Search\\}query"が必要です。

2
Bathsheba

JavaScriptでも同じことをしなければなりませんでした。私は以下の解決策を思いつきました。誰かを助けるかもしれないと思う。

function escapeSpecialCharacters(s){
 let arr = s.split('');
 arr = arr.map(function(d){
         return d.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\'+d)
       });
 let reg = new RegExp(arr.join('')); 
 return reg;
}

let newstring = escapeSpecialCharacters("hello+Search}query");
1
AMahajan