【问题标题】:Java Regex for first matching String用于第一个匹配字符串的 Java 正则表达式
【发布时间】:2015-04-09 04:08:31
【问题描述】:

我有一个字符串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

即,模式与第一个 &lt;a:Rakesh&gt; 标记匹配。

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

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

    欲了解更多信息look this thread

    你应该使用一个while循环:

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

    【讨论】:

      【解决方案2】:

      你有一个贪婪的匹配器,它不限于匹配数字。这意味着它将尽可能地匹配。由于您有两个匹配的标签,它会抓取第一个标签开始和第二个标签结束之间的每个字符。

      你可以让它不贪心(它会尽快停止,在第一个&lt;/a:Rakesh&gt;停止)或让它只匹配数字(不会匹配&lt;/a:Rakesh&gt;,在那个点停止)。

      这仅匹配数字:

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

      这是非贪婪的方法:

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

      【讨论】:

        【解决方案3】:
        1. 使用带有DOTALL 标志的非贪婪正则表达式:

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

        这样使用

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

        【讨论】:

          猜你喜欢
          • 2012-09-17
          • 2019-07-10
          • 2013-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多