我有一个包含一些分隔值的字符串:
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()
或者我错过了什么?
不幸的是,我只能提供使用的模式,并且不可能通过上述模式的结果添加一些循环。
答案 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()
方法,那么很遗憾它无法完成这项工作。