用java编写正则表达式。使用string.split()方法。我希望它在第一次出现';(';

用java编写正则表达式。使用string.split()方法。我希望它在第一次出现';(';,java,regex,Java,Regex,我有这样格式的字符串:“a,b,c,d”和这样的格式:“a(b,c,d)” 我想在“,”或“,”上拆分,但当我遇到第二种格式中的“(”时,我想终止拆分。 这就是我开始黑客攻击之前的情况 String [] stringArray = string.split(", |,"); 第一种格式的数组将包含:“a”、“b”、“c”、“d” 第二种格式的数组将包含“a(b,c,d)” 例如: String string1 = "ab,cd, de"; String string2 = "ab(de,ef

我有这样格式的字符串:“a,b,c,d”和这样的格式:“a(b,c,d)” 我想在“,”或“,”上拆分,但当我遇到第二种格式中的“(”时,我想终止拆分。 这就是我开始黑客攻击之前的情况

String [] stringArray = string.split(", |,");
第一种格式的数组将包含:“a”、“b”、“c”、“d” 第二种格式的数组将包含“a(b,c,d)”

例如:

String string1 = "ab,cd, de";
String string2 = "ab(de,ef);
String [] array1 = string1.split(...);
String [] array2 = string2.split(...);

array1 result: ["ab" "cd" "de"]
array2 result: ["ab(de,ef)"]
逗号之间的字符数没有限制。我希望这更清楚


谢谢。

我认为您可能需要一个负的lookback;根据文档,Java正则表达式类似于(或多或少)Perl正则表达式;但是可变长度的lookback没有在Perl中实现,因此
(?)将不起作用(它将匹配逗号后跟任意数量的空格或无空格,并且前面没有
后跟任何内容,即只有在前面没有
)的情况下才会匹配逗号)

我认为最简单的方法是在第一个
出现时进行分割(您可以避免regex这样做),并以不同的方式处理两个结果段,在
上分割第一个段,然后将第二个段添加到最后一个数组中(前面加上可能丢失的

编辑


由于“a(b,d)”应该给出“a(b,d)”,因此必须将
(包括)之后的任何内容附加到“first”段的最后一个拆分字符串中。但是,这个概念与前面所写的一样。

我认为您可能需要的是一个负回溯;根据文档,Java正则表达式类似(或多或少)Perl regex;但是在Perl中没有实现可变长度的lookbehind,因此
(?将不起作用(它将匹配逗号后跟任意数量的空格或不带空格,并且前面不带
后跟任何内容,即仅当前面不带
)时才匹配逗号)

我认为最简单的方法是在第一个
出现时进行分割(您可以避免regex这样做),并以不同的方式处理两个结果段,在
上分割第一个段,然后将第二个段添加到最后一个数组中(前面加上可能丢失的

编辑

由于“a(b,d)”应给出“a(b,d)”,因此必须将
(包括)之后的内容附加到“first”段最后拆分的字符串中。但是,该概念与前面所写的相同。

使用indexOf()方法

首先,检查字符串是否有“(”

index=string.indexOf('(');
if(index==-1)//表示不存在“(”
{
string.split(…);
}
其他的
{
subString=string.subString(0,index);//字符串中“(”前面的部分
//现在执行以下操作-
//1.在子字符串上继续拆分
//array1=子字符串。拆分(…)
//2.创建一个新数组,在其中插入array1的元素,
//然后是字符串的剩余部分
//array2=combine(array1,string.subString(index+1));//使用indexOf()方法

首先,检查字符串是否有“(”

index=string.indexOf('(');
if(index==-1)//表示不存在“(”
{
string.split(…);
}
其他的
{
subString=string.subString(0,index);//字符串中“(”前面的部分
//现在执行以下操作-
//1.在子字符串上继续拆分
//array1=子字符串。拆分(…)
//2.创建一个新数组,在其中插入array1的元素,
//然后是字符串的剩余部分

//array2=combine(array1,string.subString(index+1));//如果您知道括号总是正确平衡的,并且它们永远不会嵌套在其他参数中,那么这将起作用:

String[] result = source.split(",\\s*(?![^()]*\\))");
如果先行查找发现一个
而没有首先看到一个
),则它必须位于一对参数内。给定此字符串:

"ab,cd, de,ef(gh,ij), kl,mn"
结果将是:

["ab", "cd", "de", "ef(gh,ij)", "kl", "mn"]

如果您知道括号始终是正确平衡的,并且它们永远不会嵌套在其他括号中,那么这将起作用:

String[] result = source.split(",\\s*(?![^()]*\\))");
如果先行查找发现一个
而没有首先看到一个
),则它必须位于一对参数内。给定此字符串:

"ab,cd, de,ef(gh,ij), kl,mn"
结果将是:

["ab", "cd", "de", "ef(gh,ij)", "kl", "mn"]

因此,您能否提供一个有效输出的示例,换句话说,在拆分“a,b,c,d(e,f,g)”之后的有效
stringArray
,以及在
之后是否重新启动
,我的意思是
a,b,c,d(e,f,g)h,I,l
应该拆分为b,d(e,f,g)h i l?谢谢提问。我需要重新表述我的问题。请参阅编辑。一旦拆分在(,它就不应该重新启动。您的问题仍然不清楚,请添加示例输入和输出。因此,您能否提供一个有效输出的示例,换句话说,在拆分“a、b、c、d(e、f、g)”之后提供一个有效的
stringArray
如果它在
之后重新启动,我的意思是
a,b,c,d(e,f,g)h,I,l
应该拆分为b c d(e,f,g)h I l吗?谢谢你的提问。我需要重新表述我的问题。请参阅编辑。一旦拆分在(,它就不应该重新启动。你的问题仍然不清楚,请添加示例输入和输出。