首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java正则表达式匹配器查找最后一个匹配项

使用Java正则表达式匹配器查找最后一个匹配项
EN

Stack Overflow用户
提问于 2011-06-21 04:59:03
回答 11查看 50.1K关注 0票数 24

我正在尝试获得比赛的最后结果,而不必遍历.find()

下面是我的代码:

代码语言:javascript
运行
复制
String in = "num 123 num 1 num 698 num 19238 num 2134";
Pattern p = Pattern.compile("num '([0-9]+) ");
Matcher m = p.matcher(in);

if (m.find()) {
     in = m.group(1);
}

这将给我第一个结果。我如何找到最后一个匹配,而不是循环通过一个潜在的巨大的列表?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-06-21 05:11:15

您可以将.*添加到正则表达式中,这将greedily使用直到最后一个匹配的所有字符:

代码语言:javascript
运行
复制
import java.util.regex.*;

class Test {
  public static void main (String[] args) {
    String in = "num 123 num 1 num 698 num 19238 num 2134";
    Pattern p = Pattern.compile(".*num ([0-9]+)");
    Matcher m = p.matcher(in);
    if(m.find()) {
      System.out.println(m.group(1));
    }
  }
}

打印:

代码语言:javascript
运行
复制
2134

您还可以反转字符串,并更改正则表达式以匹配相反的字符串:

代码语言:javascript
运行
复制
import java.util.regex.*;

class Test {
  public static void main (String[] args) {
    String in = "num 123 num 1 num 698 num 19238 num 2134";
    Pattern p = Pattern.compile("([0-9]+) mun");
    Matcher m = p.matcher(new StringBuilder(in).reverse());
    if(m.find()) {
      System.out.println(new StringBuilder(m.group(1)).reverse());
    }
  }
}

但是,这两种解决方案都比使用while (m.find())、IMO在所有比赛中循环更好。

票数 20
EN

Stack Overflow用户

发布于 2013-04-25 07:08:01

为了获得最后一次匹配,即使这样也可以,但不确定为什么之前没有提到:

代码语言:javascript
运行
复制
String in = "num 123 num 1 num 698 num 19238 num 2134";
Pattern p = Pattern.compile("num '([0-9]+) ");
Matcher m = p.matcher(in);
if (m.find()) {
  in= m.group(m.groupCount());
}
票数 15
EN

Stack Overflow用户

发布于 2011-06-21 05:40:25

为什么不保持简单呢?

代码语言:javascript
运行
复制
in.replaceAll(".*[^\\d](\\d+).*", "$1")
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6417435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档