Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将逗号分隔的字符串动态拆分为字符串数组,在第n个逗号上拆分?_Java_Regex - Fatal编程技术网

Java 如何将逗号分隔的字符串动态拆分为字符串数组,在第n个逗号上拆分?

Java 如何将逗号分隔的字符串动态拆分为字符串数组,在第n个逗号上拆分?,java,regex,Java,Regex,我的Java Web服务的输入是一个逗号分隔的字符串列表(“ABC1、ABCD2、A1、A234B456、C1”) 如果分割阈值为2,则需要将其分割为 ABC1,ABCD2 A1、A234B456 C1 如果分割阈值为3,则需要将其分割为 ABC1,ABCD2,A1 A234B456,C1 我正试图找出一种Java正则表达式实现这一点的方法。我试着检查StringUtils API,但没有成功。这就完成了阈值2 (?:,[^,]*){1}(,) 对于阈值3将{1}更改为{2},因此它始终是

我的Java Web服务的输入是一个逗号分隔的字符串列表(“ABC1、ABCD2、A1、A234B456、C1”)

如果分割阈值为2,则需要将其分割为

ABC1,ABCD2
A1、A234B456
C1

如果分割阈值为3,则需要将其分割为
ABC1,ABCD2,A1
A234B456,C1


我正试图找出一种Java正则表达式实现这一点的方法。我试着检查StringUtils API,但没有成功。

这就完成了阈值2

(?:,[^,]*){1}(,)


对于阈值3
{1}
更改为
{2}
,因此它始终是所需的阈值-1

您可以使用如下正则表达式:

((?:[^,]*,[^,]*|[^,]+){2})(?:,|$)
其中编号
2
阈值-1

输出: 当
阈值
3
时:

ABC1,ABCD2,A1
A234B456,C1
阈值
2
时:

ABC1,ABCD2
A1,A234B456
C1
代码:

int threshold = 3;
String str = "piid1,piid2,piid3,piid4,piid5";
Pattern p = Pattern.compile("((?:[^,]*,[^,]*|[^,]+){" + (threshold-1) + "})(?:,|$)");
Matcher m  = p.matcher(str);
while (m.find()) {
    System.out.println(m.group(1));
}
piid1,piid2,piid3
piid4,piid5
输出:

int threshold = 3;
String str = "piid1,piid2,piid3,piid4,piid5";
Pattern p = Pattern.compile("((?:[^,]*,[^,]*|[^,]+){" + (threshold-1) + "})(?:,|$)");
Matcher m  = p.matcher(str);
while (m.find()) {
    System.out.println(m.group(1));
}
piid1,piid2,piid3
piid4,piid5

这是非注册码

List<String> result = new ArrayList<String>();

String temp = "";

for (int i = 0; i < splits.length; i++) {                         

    if (threshold > i%threshold) 
        temp = temp + (temp.length() > 0 ? "," : "") + splits[i];

    if (threshold - 1 == i%threshold) {
        result.add(temp);
        temp = "";
    }                                         
}

if (temp != "")  //in the case of threshold == split length 
    result.add(temp); //to add last temp

for (String string : result) {
    System.out.println(string);
}
List result=new ArrayList();
字符串temp=“”;
对于(int i=0;ii%阈值)
temp=temp+(temp.length()>0?,“:”)+拆分[i];
如果(阈值-1==i%阈值){
结果。添加(温度);
温度=”;
}                                         
}
if(temp!=“”)//在阈值==分割长度的情况下
结果。添加(温度)//添加最后一个温度
for(字符串:结果){
System.out.println(字符串);
}

我在非正则表达式中尝试了这个

if(阈值!=0){
列表结果=新建ArrayList();
StringBuilder sb=新的StringBuilder(); int len=listarr.length;
对于(int i=1;i)最简单的解决方案是只使用字符串拆分,并根据阈值重新加入结果数组中的元素。虽然从技术上讲比完全从头开始编写要慢一点,但它的可读性要高得多,并且仍然处于同一个复杂类中。当您要求正则表达式回答时,这是一个注释,但我建议ommend这样做可能更好的方法是在字符串上循环并使用逗号计数器,而不是使用正则表达式,尽管理论上,如果动态构造正则表达式字符串,它可以工作。谢谢。如果我的输入包含数千个逗号分隔的字符串,这是否是一个最佳解决方案?是的,我尝试动态构造正则表达式,但它不可用并非适用于所有情况。我查看了这篇stackoverflow文章:为什么要这样做?感觉有点像XY问题。是的,不要为此使用正则表达式。使用
.split()
和for循环将更易于维护,并提供更广泛的解决方案(因此您可以将阈值更改为您想要的任何数字)。任何正则表达式都会将阈值限制为几个值。String list=“piid1,piid2,piid3,piid4,piid5”;String[]listarr=list.split(((?:[^,]*,[^,]*,[^,]*.[^,]+){2}(?:,[124;$)”;我尝试过这个,它也不起作用,我在((?:[^,]*,[^,]*,[^,]*.[^,[^,[^,]+){3})(?:,。)在regex101中。它没有按预期进行拆分否您不能在
String#split
方法中使用此选项。您需要使用
Pattern
Matcher
api来使用
Matcher.find()从中获取匹配项
@Gnana:我在回答中也提供了您的代码。它非常有效。谢谢。让我尝试向我的团队推荐正则表达式和非正则表达式选项。