找到与Java regex matcher的最后一场比赛

kir*_*eol 19 java regex

我试图获得匹配的最后结果,而不必循环通过.find()

这是我的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

这将给我第一个结果.我怎样才能找到最后一场比赛,而不是通过潜在的巨大名单?

Bar*_*ers 18

你可以.*在你的正则表达式前加上,这将贪婪地消耗所有字符直到最后一个匹配:

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));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

打印:

2134
Run Code Online (Sandbox Code Playgroud)

您也可以反转字符串以及更改正则表达式以匹配反向字符串:

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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是这两种解决方案都不比使用while (m.find())IMO 循环所有匹配更好.

  • 是的我认为这是作弊:-).将此扩展到一般情况是极其困难的. (3认同)
  • 对于第二个解决方案+1,但对于你开始时的那个憎恶为-1.;) (3认同)

小智 14

要获得最后一场比赛,即使这样也有效,并且不确定为什么之前没有提到过:

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());
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,顺便说一下,我意识到你可能误解了`m.groupCount()`的语义 - 它与发现了多少匹配无关.它是正则表达式中有多少组的计数.在您的示例代码中,它始终为1,因为正则表达式中只有一个组. (3认同)

Gar*_*all 5

为什么不保持简单?

in.replaceAll(".*[^\\d](\\d+).*", "$1")
Run Code Online (Sandbox Code Playgroud)

  • 你能解释它的作用吗? (7认同)