java正则表达式的逆匹配
我的输入字符串如下所示:java正则表达式的逆匹配,java,regex,string-matching,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 是否有任何形式可以反转匹配?或者,我应该如何
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
是否有任何形式可以反转匹配?或者,我应该如何更改恢复最后一个数字的模式?无需对其进行分组,只需检查是否有数字后跟行尾即可
\d+$
示例代码:
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的建议,不要贪心
你也可以试试
(?将贪婪量词更改为不情愿的量词,并使用一行方法:
String lastNum = str.replaceAll("^.*?(\\d+)\\D*$", "$1");
这将从foo 12 123456
etc中提取123456
,生成。*lazy Pattern p=Pattern.compile(“.*?([0-9]+)$”);旁注:在这种情况下,您不需要正则表达式。按空格分割字符串并从结果数组中获取最后一个元素。(仅适用于您提供的示例数据)为什么不基于\\s+
进行split()
并获取最后一个数字?+1 BTW组1将包含与组0相同的匹配项,因此不需要在组()上使用组(1)
。此外,如果OP的输入中有许多行,您可以使用多行标志让$
匹配行尾,而不是字符串尾。不确定具体要求是什么,但如果输入行可以完全由数字组成,则正向查找将不起作用。@ajb我需要捕获最后一个数字:12、123、1234、12345,123456
有意义吗。@顺便说一句,ajb除了(\d+)$
之外,不需要任何额外的模式。我对所有这些答案感到非常困惑。许多非常复杂的正则表达式来自知识渊博的用户,所以我假设我在需求中遗漏了一些东西,但除此之外
String lastNum = str.replaceAll("^.*?(\\d+)\\D*$", "$1");