2011-11-10 30 views
6

如何解決此Java正則表達式問題?正則表達式:如何捕獲這個? (重複組內的嵌套組)

輸入:

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

問題:我想捕捉雙引號之間的一切。 (實施例:FDS AFSA,fwr23423等)

我曾嘗試以下模式:

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

但是執行Matcher.find()時,它會使用時導致的StackOverflowError,一個更大的輸入(但對於一個小輸入有效,這是Java中的一個錯誤)。即使它確實有效,那麼matcher.group(1)只會給出「3240acg!g」。

我該如何解決這個問題? (或者是需要使用多種模式,其中第一種模式剝去括號?)

回答

1

獲取[ ]之間的字符串,然後用逗號分隔。這很容易。

1

三點建議:

如果字符串只能括號之間發生,那麼你並不需要在所有檢查過,只需用"[^"]*"爲你的正則表達式,並找到所有的比賽(假設沒有逃脫引號)。

如果這樣做不起作用,因爲字符串也可能出現在其他地方,並且您不想捕獲它們,請分兩步執行。

  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

嗯,好的,那裏是另一種方式,但我認爲這不是一件好事。我已將它添加到我的答案中。 –

相關問題