2015-01-01 72 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

我修正了正则表达式... –

相关问题