5

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

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

4 回答 4

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 正则表达式中的 \G 是一个边界匹配器^,如

于 2012-05-09T13:31:17.033 回答
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));
于 2012-05-09T13:17:36.937 回答
0

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

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

;(?<=^(?:[^;]*;[^;]*;[^;]*;)*)
于 2012-05-09T12:50:17.007 回答
0

会像:

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

不能满足您的需求?需要注意的是会有一个尾随 ; 在小组的最后。但是,您也许可以调整表达式以将其修剪掉。

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

于 2012-05-09T14:48:42.153 回答