正则表达式:如果存在,则捕获一个或多个组(Java)

8
我希望捕获匹配模式的分组,其中输入可以包含该组一次或多次。
例如:
input = 12361 randomstuff371 12 Mar 16 138more random381 stuff73f

我希望能够捕获“12 Mar 16”这个文本。为此,我使用了简单的正则表达式:

从中我轻松地使用了正则表达式:

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}).*");

然而我的问题是,当输入包含多个这些组时,我无法捕获后续的匹配。
例如:
input = randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f

如下所示:
group 1 = 12 Mar 16
group 2 = 14 Jan 15
group 3 = 13 Feb 16

这些需要匹配的组数会随时变化,我想知道是否有一种正则表达式可以在包含1个或多个这些组的输入上工作。我已经尝试过:
pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}\\s)+.*"); \\ Not sure about whitespace at the end

然而它没有起作用。这更多是因为我如何存储这些捕获的组吗?我无法预先确定我需要多少组,特别是因为正则表达式需要处理许多这些输入。

我感觉最好是捕获整个日期段并稍后使用matcher.find()来计算我需要的组数。

任何帮助将不胜感激。


这是因为 .* 在前面和后面。不要这样做。 - Willem Van Onsem
1个回答

13

只需匹配您的特定模式并使用Matcher#find()获取子字符串作为多个匹配项,这将更加容易:

只需匹配您的特定模式并使用Matcher#find()获取子字符串作为多个匹配项,这将更加容易:

String s = "randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f";
Pattern pattern = Pattern.compile("\\b\\d{2}\\s\\w+\\s\\d{2}\\b");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(0)); 
} 

查看Java在线演示正则表达式演示

我向模式中添加了单词边界,以确保该模式被匹配为整个单词,但如果您的子字符串紧贴其他文本,则可以省略它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接