我可以使用正则表达式来匹配特定字符的每三次出现吗?

我有一个包含一些分隔值的字符串:

1.95;1.99;1.78;10.9;11.45;10.5;25.95;26;45;21.2 

我想要实现的是分号每隔三次出现一次分裂,所以我得到的String[]应该包含这个:

 result[0] = "1.95;1.99;1.78"; result[1] = "10.9;11.45;10.5"; result[2] = "25.95;26;45"; result[3] = "21.2"; 

到目前为止,我已经尝试了几种正则表达式解决方案,但我所能得到的只是找到半冒号之间的任何模式。 例如:

 (?<=^|;)[^;]*;?[^;]*;?[^;]* 

哪个匹配我想要的值,这样就不可能使用split()或者我错过了什么?

不幸的是,我只能提供使用的模式,并且不可能通过上述模式的结果添加一些循环。

 String re = "(?<=\\G[^;]*;[^;]*;[^;]*);"; String text = "1.95;1.99;1.78;10.9;11.45;10.5;25.95;26;45;21.2"; String[] result = Pattern.compile(re).split(text); 

现在结果就是你想要的
提示:\ java中的正则表达式是一个像^的边界匹配器,它意味着'上一场比赛结束'

您可以尝试这样的事情:

 String s = "1.95;1.99;1.78;10.9;11.45;10.5;25.95;26;45;21.2"; Pattern p = Pattern.compile(".*?;.*?;.*?;"); Matcher m = p.matcher(s); int lastEnd = -1; while(m.find()){ System.out.println(m.group()); lastEnd = m.end(); } System.out.println(s.substring(lastEnd)); 

你是对的。 由于Java不支持无限长的lookbehind断言(如果要在当前分号之前检查是否有3,6,9或3 * n值,则需要这些断言),因此不能使用split() 。 你的正则表达式与“全部查找”方法完美配合,但如果你不能在你的情况下应用它,那你就不走运了。

在其他语言(例如,基于.NET的语言)中,以下正则表达式将起作用:

 ;(?<=^(?:[^;]*;[^;]*;[^;]*;)*) 

会是这样的:

  ([0-9.]*;){3} 

不能满足你的需求? 需要注意的是会有一个尾随; 在小组的最后。 然而,您可能可以调整表达式来修剪它。

我只是重读了你的问题,虽然这个简单的表达式适用于匹配组,如果你需要将它提供给split()方法,遗憾的是它不能完成这项工作。