2011-11-10 10 views
6

このJava正規表現の問題をどのように解決できますか?正規表現:これをキャプチャする方法? (繰り返しグループ内のネストされたグループ)

入力:

some heading text... ["fds afsa","fwr23423","42df f","1a_4([email protected]#","3240acg!g"] some trailing text....

問題:私は、二重引用符の間のすべてをキャプチャしたいと思います。 (例:AFSA FDS、fwr23423、等)

Iは次のパターン試みた:

\[(?:"([^"]+)",?)+\]

をしかし、()Matcher.findを行う場合、それはにStackOverflowErrorになり、使用時より大きい入力(ただし、小さな入力の場合は動作しますが、これはJavaのバグです)。そしてそれがうまくいっても、matcher.group(1)は "3240acg!g"しか与えません。

どうすればこの問題を解決できますか? (または、複数のパターンを使用する必要があります。最初のパターンは角かっこを取り除きます)

答えて

1

文字列を[ ]の間で取得してカンマで区切ります。はるかに簡単です。

1

三の提案:

文字列のみを括弧の間で発生する可能性があります場合は、あなたがすべてでそれらをチェックする必要はありませんし、ちょうどあなたの正規表現として"[^"]*"を使用して(何のエスケープ引用符を想定していない)すべての一致を見つけます。

文字列が他の場所でも発生する可能性があり、文字列をキャプチャしたくない場合は、2つの手順でそれを行います。

  1. 一致\[[^\]]*\]
  2. 最初の一致の結果内にある"[^"]*"をすべて検索します。また、JSONパーサを使ってその文字列を読むこともできます。少し浮気

第三の可能性、:"[^"\[\]]*"(?=[^\[\]]*\])ため

検索。次の括弧が閉じ括弧の場合にのみ、文字列と一致します。制限:括弧は文字列内には使用できません。私はあなたが、それは、Javaでのようになります方法を見て場合は特に、これは醜い考える:

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile("\"[^\"\\[\\]]*\"(?=[^\\[\\]]*\\])"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

あなたは数ヶ月で、この時に見える誰もがそれをやっているものを伝えることができると思いますか?

+0

複数のパターン/マッチが必要です。私は何か似たものを見つけました:http://answers.oreilly.com/topic/222-how-to-find-a-match-within-another-match-in-a-regular-expression/ – Devabc

+0

別の方法ですが、私はそれが良いものだとは思いません。私はそれを私の答えに加えました。 –

関連する問題