2011-01-11 12 views
14

正規表現で特殊文字をエスケープ(または保護)する方法はありますか?regex:バックスラッシュと特殊文字をエスケープするには?

私は何をしたいのは、単純な正規表現テスターを作成することです:

import java.util.regex.*; 
class TestRegex { 
    public static void main(String ... args) { 
     System.out.printf("%s ~= %s ? %s %n" , args[0], args[1], Pattern.matches(args[0], args[1])); 
    } 
} 

プログラムにプラグインで彼らの前に私のパターンをテストするために素晴らしい作品:

$java TestRegex "\d" 1 
\d ~= 1 ? true 
$java TestRegex "\d" 12 
\d ~= 12 ? false 
$java TestRegex "\d+" 12 
\d+ ~= 12 ? true 
$java TestRegex "\d+" a12 
\d+ ~= a12 ? false 
$java TestRegex "\d+" "" 
\d+ ~= ? false 

次私のプログラムでこのパターンを使用することですが、手動でエスケープする必要があるたびに手動でエスケープする必要があります:

Pattern p = Pattern.compile(/*copy pasted regex here */); 

このサンプルでは、​​\d\\dに置き換えます。しばらくすると、これは非常に刺激的になります。

Q.これらの特殊文字は自動的にどのようにエスケープできますか?

答えて

25

すべての単一のバックスラッシュを二重のバックスラッシュに置き換えるだけです。これは少し複雑です。StringreplaceAll関数は本当に正規表現を実行し、それはリテラル(\\を生成している)であるため最初にバックスラッシュをエスケープしてから正規表現(\\\\を生成します)のために再びエスケープする必要があります。交換には同じような運命を受け、その8つのバックスラッシュの総作る二つのそのようなエスケープシーケンスを必要とします。

System.out.printf("%s ~= %s ? %s %n", 
    args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ... 
+0

私が手: '例外スレッドの「メイン」java.util.regex.PatternSyntaxException:インデックス1に近い予期しない内部エラー'http://pastebin.com/aEWSibXv – OscarRyz

+0

これは、Javaがリテラル文字列のより良い構文を持っていればいいと思います。 – Hiro2k

+0

@Oscar:あなたは 'replaceAll'自体が正規表現であるため、文字列リテラルともう1回はエスケープする必要があります。今修正されました。 –