2016-05-05 4 views
1

二重引用符のJava正規表現の間に閉じ込められていないこと、特定の文字列を検索(たとえばX)の二つの条件を満足:私は、文字列を検索したい

  1. \b(x)\b
  2. が一致しないパターンに一致しますパターン".*?(x).*?(?<!\\)"つまり

、私は完全な単語(条件1)であるのxの価値を探していますし、それがdではありません(条件2)。

  • " x /" m"
  • " x \" " + x + " except"許容されない:Xのみ第が許容可能です。

見つかるJavaコードx

+0

http://stackoverflow.com/questions/2667727/regular-expression-to-match-text-outside-quotes-etcは、http://のstackoverflow .com/questions/632475/regex-to-pick-commas-quota以外の引用符、http://stackoverflow.com/questions/6462578/alternative-to-regex-match-all-instances-not-inside-quotes (JS) - 最善の方法は、二重引用符で囲まれた部分文字列をすべて削除することです( '' [^ "] *" ')して見つけたすべての' x 'は、グループ1に「x」をマッチさせてキャプチャすれば、あなたの結果になります。 –

答えて

1

最初の状態はストレートです。 2番目の条件を確認するには、有効な二重引用符の数を確認する必要があります。それらが偶数の場合、最初の条件で取得された文字列が有効です。

String text = "basdf + \" asdf \\\" b\" + b + \"wer \\\"\""; 
String toCapture = "b"; 
Pattern pattern1 = Pattern.compile("\\b" + toCapture + "\\b"); 
Pattern pattern2 = Pattern.compile("(?<!\\\\)\""); 
Matcher m1 = pattern1.matcher(text); 
Matcher m2; 
while(m1.find()){        // if any <toCapture> found (first condition fulfilled) 
    int start = m1.start(); 
    m2 = pattern2.matcher(text); 
    int count = 0; 
    while(m2.find() && m2.start() < start){  // count number of valid double quotes " 
     count++; 
    } 
    if(count % 2 == 0) {      // if number of valid quotes is even 
     char[] tcar = new char[text.length()]; 
     Arrays.fill(tcar, '-'); 
     tcar[start] = '^'; 
     System.out.println(start); 
     System.out.println(text); 
     System.out.println(new String(tcar)); 
    } 
} 

出力:

23 
basdf + " asdf \" b" + b + "wer \"" 
-----------------------^----------- 
+1

ありがとうございます、あなたの答えは正しいようです。もう1つの解決策は、引用文の最初のすべてが配列に格納され、#で置き換えられた後に最初のパターンを探し、一致した後に、行内のそれらの文を再び復元することです。 – Mary

+0

引用符を1ステップで実行できる場合は、引用符をハッシュに変更するようアドバイスしません。あなたの入力コードもチェックしました。 – afzalex