2012-02-29 20 views
0

私はこの質問を何度かここに返してきましたRegular expression that does not contain quote but can contain escaped quoteと応答を得ましたが、何とか私はそれをJavaで動作させることができません。可能なエスケープ文字の文字列の正規表現

基本的には、最初に有効な文字列と一致し、引用符で終わる正規表現を作成する必要があります。また、エスケープされていれば、その間に引用符を付けることができます。

以下のコードでは、基本的に3つの文字列をすべて一致させて印刷することができますが、できません。

正しい正規表現は何ですか?

おかげ

public static void main(String[] args) { 

    String[] arr = new String[] 
      { 
       "\"tuco\"", 
       "\"tuco \" ABC\"", 
       "\"tuco \" ABC \" DEF\"" 
      }; 

    Pattern pattern = Pattern.compile("\"(?:[^\"\\\\]+|\\\\.)*\""); 

    for (String str : arr) { 
     Matcher matcher = pattern.matcher(str); 
     System.out.println(matcher.matches()); 
    } 

} 
+1

コードがあなたの説明と一致しません。 '' arr'の要素は、 '' tuco ''、' 'tuco" ABC "'、 '' tuco "ABC" DEF "'を含む文字列です - つまり、 – ruakh

+0

@ ruakhのコメントに追加すると、引用符で囲まれたエスケープは '' tuco \\\ "ABC \\\" "'のようになります。 –

+0

正規表現が有効な文字列と一致する必要があります。それを有効な文字列にします。基本的には、3つの式のすべてに対して出力を真にしたいのですが、 – Tuco

答えて

0

は問題はそんなにあなたの正規表現ではなく、あなたのテスト文字列ではありません。リテラル文字列が解析されると、2番目と3番目のサンプル文字列の内部引用符の前の単一のバックスラッシュが消費されます。正規表現エンジンに渡される文字列には、引用符の前にバックスラッシュはありません。 (それを印刷してみてください。)ここでは期待通りに動作しますあなたの関数のテストバージョンです:

import java.util.regex.*; 
public class TEST 
{ 
    public static void main(String[] args) { 

     String[] arr = new String[] 
       { 
        "\"tuco\"", 
        "\"tuco \\\" ABC\"", 
        "\"tuco \\\" ABC \\\" DEF\"" 
       }; 

//old: Pattern pattern = Pattern.compile("\"(?:[^\"\\\\]+|\\\\.)*\""); 
     Pattern pattern = Pattern.compile(
      "# Match double quoted substring allowing escaped chars.  \n" + 
      "\"    # Match opening quote.      \n" + 
      "(    # $1: Quoted substring contents.   \n" + 
      " [^\"\\\\]* # {normal} Zero or more non-quote, non-\\. \n" + 
      " (?:   # Begin {(special normal*)*} construct.  \n" + 
      " \\\\.  # {special} Escaped anything.    \n" + 
      " [^\"\\\\]* # more {normal} non-quote, non-\\.   \n" + 
      " )*   # End {(special normal*)*} construct.  \n" + 
      ")    # End $1: Quoted substring contents.  \n" + 
      "\"    # Match closing quote.      ", 
      Pattern.DOTALL | Pattern.COMMENTS); 

     for (String str : arr) { 
      Matcher matcher = pattern.matcher(str); 
      System.out.println(matcher.matches()); 
     } 
    } 
} 

私は(MRE3から取られた)改良版のためのあなたの正規表現を置換しました。この質問には多くの質問が寄せられることに注意してください。機能的に同等の表現をいくつか比較してください。this answerを参照してください。