2015-11-16 54 views
2

我輸入的文字是這樣的:查找雙方括號內的所有子序列

..some_text0 [[some_text1]] some_text2 [[some_text3]] some_text4 ....

我想提取包含雙方括號中的所有文本,或者我想分別獲得團體:

some_text1 
some_text3 

我試過這個解決方案:

Matcher m = Pattern.compile("\\[\\[.*\\]\\]").matcher(line_input); 

while (m.find()) { 

    System.out.println("Found: " + matcher.group()); 

} 

但這打印我:

[[some_text1]] some_text2 [[some_text3]] 

作爲唯一的結果。如何實現我的目標?

+1

小組賽沒有任何字符串搜索的[[後續。 –

+1

''\\ [\\ [。*?\\] \\]「' –

+0

@PranavCBalan您的解決方案有效,如果您向我提供解釋作爲答案aerea我將標記您的答案 – Leonardo

回答

1

此任務的正則表達式是如下

\[\[(.*?)]] 

它通過關閉與]]

這裏是DEMOexplanation

+1

請注意,您不需要在字符類外部轉義']'。此外,這個正則表達式'[[\ [([^ \]] +)\] \]'不會匹配[[text = [placeholder] _test]],[mine will](https:// regex101。 com/r/pG1nZ4/5),因爲它基本上像'。*?'一樣工作。 –

+1

這是OP的想要的範圍之外,但它包含在小的更正之後。 – MaxZoom

1

使用\[\[.*?]]正則表達式很慢,.與默認情況下不匹配換行符,如果解析非常長的字符串時回溯極限耗盡,則可能會遇到問題。

我建議使用基於展開,在環法正則表達式:

\[{2}([^\]]*(?:\](?!\])[^\]]*)*)\]{2} 

甚至更​​短的

\[{2}([^\]]*(?:\][^\]]+)*)\]{2} 

regex demo 1demo 2

這裏是一個Java demo

String str = "some_text0 [[some_text1]] some_text2 [[some_text3]] some_text4"; 
Pattern ptrn = Pattern.compile("\\[{2}([^\\]]*(?:\\][^\\]]+)*)\\]{2}"); 
Matcher matcher = ptrn.matcher(str); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

結果:

some_text1 
some_text3 

Regex的擊穿:

  • \[{2} - 嚴絲合縫2 [符號
  • [^\]]* - 匹配0或大於]
  • (?:\][^\]]+)*其他多個符號 - 匹配0或多個序列...
    • \] - 單個]後跟
    • [^\]]+ - 比]其它1個或多個符號
  • \]{2} - 完全匹配2 ]符號。

與基於.*?的正則表達式的區別在於匹配變得更線性,因此正則表達式模式更快,更不容易出錯。

+0

你的正則表達式也匹配空括號,比如'[[]]' – MaxZoom

+0

是的,它與'「\\ [\\ [。* \\] \\]」和'「\\ [\\ [。* ?\\] \\]「'適用於OP。 –

+0

@MaxZoom:沒問題,請使用組1. –