2012-03-23 16 views
2

私はすべての特殊文字をエスケープしたいSQLクエリです。だから私は、Th1正規表現を作成しました:Java regexからOracle SQLの特殊文字をエスケープする

Pattern p1 = Pattern.compile("\\{ | \\} | \\\\ | \\, | \\& | \\? |" 
      + " \\(| \\) | \\[ | \\] | \\- | \\; | \\~ | \\| | \\ $ | " 
      + "\\! | \\< | \\> | \\* | \\% | \\_"); 
Matcher m1=p1.matcher(s); 

は今、私はそれがすべての一致を反復処理し、その前に「\」文字を入れたいです。たとえば、文字列が:aa%aa $ aaの場合、それはaa \%aa \ $ aaになります。これどうやってするの?

System.out.println("abcdef".replaceAll("[a-c]", "\\\\$0")); 

\a\b\cdef 

注の過剰な数を生成し、例えば

myString.replaceAll(myPattern, "\\\\$0") 

答えて

3

あなたが一致した式の値を参照するために参照$0バック使用することができ置き換えのスラッシュ:私はregexpに2つのバックスラッシュを渡す必要があります(ファー1つは2番目のものをエスケープします)、それぞれのために、Javaが独自のエスケープを行うために2つを置く必要があります。

+0

THXなる与えます – czadam

3

あなたがやりたいことがSQL文字をエスケープする場合は、独自のエスケープを作成するのではなく、JavaでPreparedStatementsを使用することをお勧めします。言われて、正規表現でそうすることが可能であろうが、それはあなたがそう

(a)(b)(c) 

そして、あなたが参照することができ、文字のような括弧のパターンをキャプチャする必要が簡単

0

ではないことを

たとえば、$ +括弧ペア

の序によってそれらに、あなたは置換パターン

$1\$2$3 
を適用した場合

それは、それが正常に動作し、Javaで

a\bca\bc 

この

String resultString = subjectString.replaceAll("(a)(b)(c)", "$1\\\\$2$3"); 
関連する問題