2015-01-01 66 views
2

我有以下文字:多個正則表達式的字符串匹配

bla [string1] bli [string2] 

我喜歡在Java中的循環匹配字符串1和字符串使用正則表達式。

怎麼辦?

到目前爲止我的代碼,其中僅第一字符串1相匹配,但不也串2

String sRegex="(?<=\\[).*?(?=\\])"; 
     Pattern p = Pattern.compile(sRegex); // create the pattern only once, 
     Matcher m = p.matcher(sFormula); 
     if (m.find()) 
     { 
      String sString1 = m.group(0); 
      String sString2 = m.group(1); // << no match 
     } 

回答

1

你的正則表達式是不使用任何捕獲組,因此該調用與拋出異常:

m.group(1); 

你可以用用:

String sRegex="(?<=\\[)[^]]*(?=\\])"; 
Pattern p = Pattern.compile(sRegex); // create the pattern only once, 
Matcher m = p.matcher(sFormula); 
while (m.find()) { 
    System.out.println(m.group()); 
} 

而且if應該REPL最高排在while以匹配多次返回所有匹配。

+0

不爲我工作。這正是我的問題。你的代碼也只匹配第一個字符串。如何做到這一點匹配第二個字符串2?我喜歡在字符串中包含[?]的所有匹配項。 –

+0

'if'應該被'while'代替以匹配多次以返回所有匹配。 – anubhava

+0

好的。我懂了。非常感謝。你的提示解決了這個問題。親切的問候 –

1

您的方法很困惑。您可以編寫正則表達式,使其與一個模式中的兩個[....]序列相匹配,或者多次調用find。你目前的嘗試有一個正則表達式「找到」只有一個[...]序列。

嘗試這樣:

Pattern p = Pattern.compile("\\[([^\\]]+)]"); 
    Matcher m = p.matcher(formula); 
    if (m.find()) { 
     String string1 = m.group(0); 
     if (m.find(m.end()) { 
      String string2 = m.group(0); 
     } 
    } 

或者推廣使用循環和String對所提取的字符串數組。

(你不需要任何花哨的外觀,背後的模式在這種情況下,和醜陋的「匈牙利命名法」是用Java皺起了眉頭,所以走出使用它的習慣。)

+0

這正是我的問題。如何編寫正則表達式來匹配字符串中的所有[?]。我試過你的正則表達式,但是它在java.util.regex.PatternSyntaxException中拋出了一個錯誤:在索引附近有未封閉的組。我所喜歡的是如何在大字符串的括號中獲得所有字符串。我不知道,那就是爲什麼我問:-) –

+0

問題解決了。謝謝。 –

+0

我修正了正則表達式... –

相關問題