2010-12-29 9 views
21

テキストを疑問符(?)で囲むパターンを定義しようとしています。正規表現では、疑問符は「一度だけ」とみなされます。 パターンの問題を修正するために、テキスト内の(?)記号を(\\?)に置き換えることはできますか?疑問符(?)を(\?)に置き換えます。

String text = "aaa aspx?pubid=222 zzz"; 
Pattern p = Pattern.compile("aspx?pubid=222"); 
Matcher m = p.matcher(text); 

if (m.find()) 
System.out.print("Found it."); 
else 
System.out.print("Didn't find it."); // Always prints. 
+2

あなたは 'を交換してみました':?
たとえば、あなたのコードは次のようになりますか?ここで質問するよりも簡単です。 – Carl

答えて

40

あなたが正規表現ではなく、テキスト\\?として?をエスケープする必要があります。

Pattern p = Pattern.compile("aspx\\?pubid=222"); 

See it

あなたはまた、正規表現のメタ文字を引用するためにこの方法をPatternクラスのquote方法を利用することができあなたがは、それらを引用心配する必要はありません必要があります

Pattern p = Pattern.compile(Pattern.quote("aspx?pubid=222")); 

See it

+0

はい、申し訳ありません、それは私が言ったことです...私は、交換する必要がありますか? \\で?正規表現では – Brad

+0

@Downvoter:私はあなたが間違っていると思われることを知りたいです。 'Pattern.quote'には – codaddict

+0

+1です。それが行く方法です。 – wchargin

3

Javaで正規表現のための任意のテキストを逃れるための正しい方法を使用することです:

String quotedText = Pattern.quote("any text goes here [email protected] #593 ++ { ["); 

その後、正規表現の一部としてquotedTextを使用することができます。

String text = "aaa aspx?pubid=222 zzz"; 
String quotedText = Pattern.quote("aspx?pubid=222"); 
Pattern p = Pattern.compile(quotedText); 
Matcher m = p.matcher(text); 

if (m.find()) 
    System.out.print("Found it."); // This gets printed 
else 
    System.out.print("Didn't find it."); 
+0

「正しい道」と言えるかどうか分かりません。あなたのパターンが(引数のために) '?* \ + *?'奇妙な文字はリテラルです。むしろ "\\?* \\\\ + \\ *?"と表示されますか?または "[Pattern.quote("? ")+" * "+ Pattern.quote(" \\ ")+" + "+ Pattern.quote(" * ")+"? " ]]あなたのコードですか?これは、Pattern.quoteの使用は、正規表現のためにテキストをエスケープする最も簡単なエラーの起こりやすい方法として簡単に記述できることに同意しました。 –

+0

もしそれが何らかの種類の文字列であれば、私は間違いなくPattern.quote()を使用します。それが外側の式の一部であるか、または1つの文字だけが引用符で囲まれていれば、私はそれをエスケープします。元の質問では、Bradは文字列ではなく文字列を引用する必要があります。 –

関連する問題