2017-03-27 94 views
8

我想捕获匹配输入可以包含此组的一个或多个模式的组。正则表达式:捕获一个或多个组(如果存在)(Java)

例子:

input = 12361 randomstuff371 12 Mar 16 138more random381 stuff73f 

我想捕捉的 “16年3月12日”。

从这个我很容易地使用正则表达式:

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 

以匹配将总是改变这些基团的数目,因此我不知道是否有一个正则表达式,将工作在输入包含一个或多个这些组。我曾尝试过:

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}\\s)+.*"); \\ Not sure about whitespace at the end 

但是它不起作用。这更多与我如何存储这些捕获的组有关?我不能预先确定我需要的组的数量,特别是因为正则表达式需要处理许多这些输入。

我感觉好像只是捕捉整个日期段并稍后用matcher.find()来处理它来计算我需要的组数。

任何帮助将不胜感激。

+0

这是因为前后的'。*'。不要这样做。 –

+0

@詹姆斯,请考虑接受答案,如果它适合你(请参阅[如何接受所​​有答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) )。 –

回答

13

它会更容易只匹配你的特定图案,并使用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)); 
} 

online Java demoregex demo

我向模式添加了单词边界以确保模式匹配为整个单词,但是如果您的子字符串粘在另一个文本上,它们可能会被忽略。

相关问题