Java Regex首先匹配String

时间:2015-02-09 12:08:18

标签: java regex

我有一个字符串hhht。我需要grep 12121212&来自字符串的56565656。我到目前为止所做的尝试如下所示。

String hhht = "dhdhdh<a:Rakesh>12121212</a:Rakesh>sdsdvsdvsvvsv"+"sfsf"+"<a:Rakesh>56565656</a:Rakesh>zvnbjvbj";

Pattern pattern    = Pattern.compile("<a:Rakesh>(.+)</a:Rakesh>");
Matcher matcher    = pattern.matcher(hhht);

for(int hh = 0 ;hh <matcher.groupCount(); hh++){
    if(matcher.find())
        System.out.println(matcher.group(hh+1));

}

我得到了输出,

12121212</a:Rakesh>sdsdvsdvsvvsvsfsf<a:Rakesh>56565656

,即模式与第一个<a:Rakesh>标记匹配。

3 个答案:

答案 0 :(得分:2)

  1. 使用带有DOTALL标志的非贪婪正则表达式:

    Pattern pattern = Pattern.compile("(?s)<a:Rakesh>(.+?)</a:Rakesh>");
    
  2. 在致电matcher.groupCount()之前,您无法获得find

  3. 像这样使用

    if(matcher.find()) {
       for(int hh = 0; hh <= matcher.groupCount(); hh++){
            System.out.println(matcher.group(hh+1));    
       }
    }
    

答案 1 :(得分:1)

你有一个贪婪的匹配器,不仅限于匹配数字。这意味着它将尽可能匹配 。由于您有两个匹配的标记,因此它会抓取第一个标记的开头和第二个标记的关闭之间的每个字符。

你可以让它非贪婪(它会尽可能早地停止,在第一个</a:Rakesh>停止)或使它只匹配数字(与</a:Rakesh>不匹配,在那时停止)。

这只匹配数字:

"<a:Rakesh>(\\d+)</a:Rakesh>"

这是非贪婪的方法:

"<a:Rakesh>(.+?)</a:Rakesh>"

答案 2 :(得分:1)

这取决于贪图匹配: 采取这种模式:

Pattern pattern    = Pattern.compile("<a:Rakesh>(.+?)</a:Rakesh>");

了解更多信息look this thread

你应该使用while循环:

    while (matcher.find()) {
            System.out.println(matcher.group(1));

    }