用于第一个匹配字符串的 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
即,模式与第一个 <a:Rakesh>
标记匹配。
【问题讨论】:
【参考方案1】:这取决于贪婪匹配: 采用这种模式:
Pattern pattern = Pattern.compile("<a:Rakesh>(.+?)</a:Rakesh>");
欲了解更多信息look this thread。
你应该使用一个while循环:
while (matcher.find())
System.out.println(matcher.group(1));
【讨论】:
【参考方案2】:你有一个贪婪的匹配器,它不限于匹配数字。这意味着它将尽可能地匹配。由于您有两个匹配的标签,它会抓取第一个标签开始和第二个标签结束之间的每个字符。
你可以让它不贪心(它会尽快停止,在第一个</a:Rakesh>
停止)或让它只匹配数字(不会匹配</a:Rakesh>
,在那个点停止)。
这仅匹配数字:
"<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 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章