与java正则表达式反向匹配

时间:2014-07-18 15:44:29

标签: java regex string-matching

我的输入字符串是这样的:

foo 12
12 foo 123
foo 12 foo 1234
f1o2o 12345
foo 12 123456
...

我需要捕获最后一个数字:12, 123, 1234, 12345, 123456 ... 每一行都是单独处理的:

Pattern p = Pattern.compile(".*([0-9]+)$");
Matcher m = p.matcher("foo 12 123456");
m.matches()

输出:6

有没有任何形式来反转匹配?或者我该如何更改模式以恢复最后一个数字?

2 个答案:

答案 0 :(得分:1)

无需对其进行分组,只需检查数字后跟行尾。

\d+$

DEMO

示例代码:

Pattern p = Pattern.compile("\\d+$",Pattern.MULTILINE);
Matcher m = p.matcher("foo 12 123456\n12 foo 123");
while (m.find()) {
    System.out.println(m.group());
}

输出:

123456
123

贪婪尽可能多地查找匹配项,因此它也捕获数字并留下[0-9]+

的最后一位数字

按照@Zack Newsham

的建议让它变得非贪婪

DEMO


您也可以尝试使用Positive Lookbehind

(?<=\D)\d+$

DEMO

答案 1 :(得分:1)

将贪婪的量词变为不情愿的量词并使用单行方法:

String lastNum = str.replaceAll("^.*?(\\d+)\\D*$", "$1");

这会从123456

中提取foo 12 123456