2012-06-05 221 views
1

如果我有一個這樣的字符串(從維基標記),我需要在Java解析文本:查找方括號而不是括號

this link (is [[ inParen ]] and) (this) one is [[ notInParen ]] 

我想使用正則表達式來提取[[]]內的文本,但不在括號內。例如,在上面的例子中,它應該返回:

notInParen 

但忽略:

inParen and this 

...因爲它們是在括號內。我能找到的括號和括號分開沒有問題:

.*\(.*?\).* and .*?\[\[(.*?\]\].* 

...但無法弄清楚如何找到[[]],看看周圍的括號,並忽略。謝謝!

回答

1

這是一個很好的正則表達式

\(.*?\)|\[\[(.*?)]] 

你想要的比賽將是在第1組

僅供參考,以使其更好地履行你可以最大限度地減少了否定的字符類取代懶比賽回溯。

在Java中,這成爲

String ResultString = null; 
try { 
    Pattern regex = Pattern.compile("\\(.*?\\)|\\[\\[(.*?)\\]\\]", Pattern.DOTALL | Pattern.MULTILINE); 
    Matcher regexMatcher = regex.matcher(subjectString); 
    if (regexMatcher.find()) { 
     ResultString = regexMatcher.group(1); 
    } 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 

注意,1組將是空的情況下,交替的第一部分做匹配。

+0

嗯,不適合我...我得到空。 – JeffThompson

+0

@JeffThompson將'if(regexMatcher.find())'改爲'while(regexMatcher.find())'而忽略'null' – Pshemo

+0

它就是這樣! '雖然'似乎已經做到了。 – JeffThompson

4

是否需要一氣呵成?你可以這樣做:

  • 解析字符串並刪除括號中包含的所有子字符串。
  • 再次解析結果並採取與[[]]所有所需的維基百科鏈接。

這解決了問題,使問題更容易解決。

在步驟1之後,您有:this link one is [[ notInParen ]]

在步驟2之後,您有:notInParen

+0

啊,輝煌!其中一個「砰砰撞牆」,用簡單的答案在臉上瞬間凝視着我。然而,希望看到正則表達式版本! – JeffThompson

0

你也可以這樣來做

String data = "this link (is [[ inParen ]] and) (this) one is [[ notInParen ]]" + 
     " this link (is [[ inParen ]] and) (this) one is [[ notInParen ]]"; 

boolean insideParentheses = false; 
int start = 0, end = 0; 
for (int i = 0; i < data.length() - 1; i++) { 
    if (data.charAt(i) == '(') 
     insideParentheses = true; 
    if (data.charAt(i) == ')') 
     insideParentheses = false; 
    // -> [[ and ]] inside Parentheses are not important 
    if (!insideParentheses && 
      data.charAt(i) == '[' && data.charAt(i + 1) == '[') { 
     start = i; 
    } 
    if (!insideParentheses && 
      data.charAt(i) == ']' && data.charAt(i + 1) == ']') { 
     end = i; 
     System.out.println(data.substring(start, end + 2)); 
    } 
} 

輸出

[[ notInParen ]] 
[[ notInParen ]]