用于第一个匹配字符串的 Java 正则表达式

Posted

技术标签:

【中文标题】用于第一个匹配字符串的 Java 正则表达式【英文标题】:Java Regex for first matching String 【发布时间】: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; 标记匹配。

【问题讨论】:

【参考方案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】:

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

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

    在调用find之前,您无法获得matcher.groupCount()

这样使用

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

【讨论】:

以上是关于用于第一个匹配字符串的 Java 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

java 正则获取 第一个匹配

Java中的正则表达式

字符串文本匹配神器———Java正则表达式

用于匹配 JSON 子字符串某些部分的 Java 正则表达式

正则表达式(java)

基于java的正则表达式