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

时间:2012-05-09 12:46:39

标签: java regex split

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

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()或者我错过了什么?

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

4 个答案:

答案 0 :(得分:2)

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 in regex中的G是像^这样的边界匹配器,它意味着'上一场比赛的结束'

答案 1 :(得分:1)

您可以尝试这样的事情:

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));

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

会是这样的:

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

不能满足您的需求?需要注意的是会有一个尾随;在小组结束时。您可能可以调整表达式来修剪它。

我刚刚重新阅读了您的问题,虽然这个简单的表达式适用于匹配组,但如果您需要将其提供给split()方法,那么很遗憾它无法完成这项工作。