正则表达式在多场比赛中

时间:2013-03-14 08:28:09

标签: java regex

你们有人可以帮帮我吗?我将字符串下载到“结果”,如下所示:

DrawDate,Ball 1,Ball 2,Ball 3,Ball 4,Ball 5,Ball 6,Bonus Ball,Ball Set,Machine27-Feb-2013,2,24,14,23,20,30,22,6,MERLIN23-Feb-2013,31,25,32,2,30,16,36,5,MERLIN20-Feb-2013,36,45,3,6,44,48,47,8,MERLIN16-Feb-2013,7,27,48,46,39,20,49,6,ARTHUR13-Feb-2013,6,49,23,29,14,20,48,8,MERLIN09-Feb-2013,10,8,34,40,27,41,48,7,MERLIN06-Feb-2013,9,18,10,16,27,42,43,6,ARTHUR02-Feb-2013,2,13,14,21,12,30,39,7,ARTHUR30-Jan-2013,10,9,43,48,47,24,5,5,ARTHUR26-Jan-2013,2,6,21,29,47,34,11,5,ARTHUR
23-Jan-2013,10,6,32,24,41,14,29,8,MERLIN19-Jan-2013,35,5,9,13,39,16,11,7,ARTHUR16-Jan-2013,13,38,47,12,35,5,45,3,MERLIN12-Jan-2013,3,11,27,24,12,7,13,8,ARTHUR09-Jan-2013,48,39,24,21,5,25,32,6,MERLIN05-Jan-2013,15,37,10,21,17,47,2,5,ARTHUR02-Jan-2013,37,20,30,21,7,9,42,7,MERLIN29-Dec-2012,40,31,6,37,8,48,36,5,GUINEVERE26-Dec-2012,3,11,49,39,47,17,34,6,LANCELOT22-Dec-2012,34,28,4,44,43,14,13,4,LANCELOT

然后使用下面的正则表达式

Pattern p = Pattern.compile("(Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN)(.*?)(GUINEVERE|LANCELOT|ARTHUR|MERLIN)"); 

Matcher m = p.matcher(result);

while (m.find())
{
matchesList.add(m.group()); 
}

这是我的列表视图

1, Machine27-Feb-2013,2,24,14,23,20,30,22,6,LANCELOT

2, MERLIN20-Feb-2013,36,45,3,6,44,48,47,8,GUINEVER

3, ARTHUR13-Feb-2013,6,49,23,29,14,20,48,8,MERLIN

正则表达式错过了每一个偶数行

1, Machine27-Feb-2013,2,24,14,23,20,30,22,6,LANCELOT

2, 23-Feb-2013,31,25,32,2,30,16,36,5,

3, MERLIN20-Feb-2013,36,45,3,6,44,48,47,8,GUINEVER

4, 16-Feb-2013,7,27,48,46,39,20,49,6,

5, ARTHUR13-Feb-2013,6,49,23,29,14,20,48,8,MERLIN

6, 09-Feb-2013,10,8,34,40,27,41,48,7,

这就是我所追求的:

1, 27-Feb-2013,2,24,14,23,20,30,22,6

2, 23-Feb-2013,31,25,32,2,30,16,36,5

3, 20-Feb-2013,36,45,3,6,44,48,47,8

4, 16-Feb-2013,7,27,48,46,39,20,49,6

5, 13-Feb-2013,6,49,23,29,14,20,48,8

6, 09-Feb-2013,10,8,34,40,27,41,48,7

这适用于 C# "(?s)(?<=Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN).*?(GUINEVERE|LANCELOT|ARTHUR|MERLIN)" Java

中的

我已尝试从网络到无效的各种方式。试过 ^ $ ,但不明白怎么工作?

1 个答案:

答案 0 :(得分:0)

正则表达式的“(机器| GUINEVERE | ...)”部分是捕获组。这意味着(1)它们包含在结果中,(2)以下匹配在之后开始

在c#版本中,您使用第一个机器块的“零宽度正向后观”分组(“(?&lt; = ...)”),这有所帮助。现在你只需要为尾随组使用零宽度正向前瞻。这会将正则表达式更改为:

(?<=Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN)(.*?)(?=GUINEVERE|LANCELOT|ARTHUR|MERLIN)

哪个几乎做你想要的。它仍然在输出中生成尾随逗号和前导空格。所以将正则表达式更改为:

(?<=Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN)\\s*(.*?),?(?=GUINEVERE|LANCELOT|ARTHUR|MERLIN)

并访问“m.group(1)”而不是“m.group()”。这样,您只能获得与“(。*?)”匹配的部分。

这个特定例子的替代方案是

String[] parts = result.split("[\\s,]*(Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN)[\\s,]*");

并丢弃第一个结果(“DrawDate,...”)。