2011-08-04 19 views
0

私は、Java正規表現の構文よりも簡単なワイルドカードでユーザー入力を照合しようとしています。java regex(引用符で囲まれていない)の特殊文字をエスケープする

this (is \ a $ test.

と検索文字列で「test」と一致する:ユーザーはその後、入力文字列を入力します。ワイルドカードA.があると言う

this (is \ a $ %A%.

私はワイルドカードを交換することにより、これを行います検索文字列の文字列を(.+?)とすると、ワイルドカードと正規正規表現のキャプチャグループを一致させることができます。しかし、私はまだ特殊文字をエスケープしたい。私は引用符を使用する場合は、正規表現は、もはや仕事は、正規表現の意味((.+?))を持つ文字も引用されているためだろう。

String inputString = "this (is \\ a $ test." 
String searchString = "this (is \\ a $ %A%." 
String regex = Pattern.quote(searchString); 
//regex = "\\Qthis (is \\ a $ %A%.\\E" 
regex = regex.replaceFirst("%A%", "(.+?)"); 
//regex = "\\Qthis (is \\ a $ (.+?).\\E" 
Matcher matcher = Pattern.compile(regex).matcher(inputString); //no match 

は本当に特殊文字をエスケープする組み込みの方法はあります、文字列全体を引用しません?

答えて

1

%A%を見つける必要があります。その前にすべてを引用し、その後にすべてを引用し、一致する正規表現の構文に置き換える必要があります。

私は完全な要件は、このワイルドカードのためにあるかわからないんだけど、それだけで今まで%A%することができた場合、それはこのようなものになります。ワイルドカードがあなたの代わりにかもしれないさまざまな形態を持つことができる場合は

String searchString = "this (is \\ a $ %A%."; 
String extractorToken = "(.+?)"; 

int indexOfWildcard = searchString.indexOf("%A%"); 
String pattern = Pattern.quote(searchString.substring(0, indexOfWildcard)) + 
       extractorToken + 
       Pattern.quote(searchString.substring(indexOfWildcard + 3, searchString.length())); 
Matcher matcher = Pattern.compile(pattern).matcher(inputString); 

を正規表現を使用してワイルドカードの位置を特定し、上記を実行します。

関連する問題