在 Java 正则表达式中,如何从未知长度的字符串中捕获数字?
In Java with regular expressions, how to capture numbers from a string with unknown length?
我的正则表达式如下所示:"[a-zA-Z]+[ \t]*(?:,[ \t]*(\d+)[ \t]*)*"
我可以用这个匹配线条,但我不知道如何捕捉数字,我认为它必须对分组做一些事情。
例如:从字符串"asd , 5 ,2,6 ,8"
中,如何抓取数字5 2 6和8?
再举几个例子:
sdfs6df -> no capture
fdg4dfg, 5 -> capture 5
fhhh3 , 6,8 , 7 -> capture 6 8 and 7
asdasd1,4,2,7 -> capture 4 2 and 7
所以我可以继续使用这些数字进行工作。提前致谢。
您可以匹配前导单词字符并利用 \G
锚捕获逗号后的连续数字。
模式
(?:\w+|\G(?!^))\h*,\h*([0-9]+)
说明
(?:
非捕获组
\w+
匹配 1+ 个字符
-|
或
\G(?!^)
在上一场比赛结束时断言位置,而不是在开始时
)
关闭非捕获组
\h*,\h*
匹配水平空白字符之间的逗号
([0-9]+)
捕获第 1 组,匹配 1+ 个数字
在 Java 中使用双转义反斜杠:
String regex = "(?:\w+|\G(?!^))\h*,\h*([0-9]+)";
示例代码
String regex = "(?:\w+|\G(?!^))\h*,\h*([0-9]+)";
String string = "sdfs6df -> no capture\n\n"
+ "fdg4dfg, 5 -> capture 5\n\n"
+ "fhhh3 , 6,8 , 7 -> capture 6 8 and 7\n\n"
+ "asdasd1,4,2,7 -> capture 4 2 and 7";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
输出
5
6
8
7
4
2
7
我的正则表达式如下所示:"[a-zA-Z]+[ \t]*(?:,[ \t]*(\d+)[ \t]*)*"
我可以用这个匹配线条,但我不知道如何捕捉数字,我认为它必须对分组做一些事情。
例如:从字符串"asd , 5 ,2,6 ,8"
中,如何抓取数字5 2 6和8?
再举几个例子:
sdfs6df -> no capture
fdg4dfg, 5 -> capture 5
fhhh3 , 6,8 , 7 -> capture 6 8 and 7
asdasd1,4,2,7 -> capture 4 2 and 7
所以我可以继续使用这些数字进行工作。提前致谢。
您可以匹配前导单词字符并利用 \G
锚捕获逗号后的连续数字。
模式
(?:\w+|\G(?!^))\h*,\h*([0-9]+)
说明
(?:
非捕获组\w+
匹配 1+ 个字符 -|
或\G(?!^)
在上一场比赛结束时断言位置,而不是在开始时
)
关闭非捕获组\h*,\h*
匹配水平空白字符之间的逗号([0-9]+)
捕获第 1 组,匹配 1+ 个数字
在 Java 中使用双转义反斜杠:
String regex = "(?:\w+|\G(?!^))\h*,\h*([0-9]+)";
示例代码
String regex = "(?:\w+|\G(?!^))\h*,\h*([0-9]+)";
String string = "sdfs6df -> no capture\n\n"
+ "fdg4dfg, 5 -> capture 5\n\n"
+ "fhhh3 , 6,8 , 7 -> capture 6 8 and 7\n\n"
+ "asdasd1,4,2,7 -> capture 4 2 and 7";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
输出
5
6
8
7
4
2
7