Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java正则表达式的逆匹配_Java_Regex_String Matching - Fatal编程技术网

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");