简体   繁体   中英

In Java, how to split strings without using delimiters in brackets?

I want to split a string by comma, but I want the comma between the brackets are ignored.

For example:

Input:
a1:b1, a2:b2, [a3:b3-c3, b4, b5], a4:b6

Output:
a1:b1
a2:b2
[a3:b3-c3, b4, b5]
a4:b6

Thank you for your help in advance.

You will have to parse char-by-char in order to be precise, else you can do a hack like this:

(pseudo-code)

1. replace all brackets by (distinct) dummy placeholders (the format will depend on your context)
2. split the (new) string by the (remaining) commas (st.split(","))
3. re-replace the distinct placeholders with the original brackets values (you will have to store them somewhere) (foreach placeholder: st = st.replace(placeholder, bracket);)

Note: On step 1, you dont replace placeholders manualy, you use a regex (eg /[[^]]+]/ ) to replace the brackets by placeholders (and store them as well), and then replace back in step 3.

Example:

input: a1:b1, a2:b2, [a3:b3-c3, b4, b5], a4:b6

step1: intermediate output: a1:b1, a2:b2, __PLACEHOLDER1_, a4:b6

step2: intermediate output:

a1:b1 a2:b2 __PLACEHOLDER1_ a4:b6

step3: output: a1:b1 a2:b2 [a3:b3-c3, b4, b5] a4:b6

Effectively what you do here is a hierarchical split and replace , since no regex can match context-sensitive (as no regex can count parantheses).

You can use this regex ,(?![^\\[]*\\]) :

String str="a1:b1, a2:b2, [a3:b3-c3, b4, b5], a4:b6";
System.out.println(Arrays.toString(str.split(",(?![^\\[]*\\])")));

It will ignore all commas inside the square brackets.

Sample program :

import java.util.Arrays;
public class HelloWorld{

     public static void main(String []args){
        String str="a1:b1, a2:b2, [a3:b3-c3, b4, b5], a4:b6";
        System.out.println(Arrays.toString(str.split(",(?![^\\[]*\\])")));
     }
}

Output:

[a1:b1,  a2:b2,  [a3:b3-c3, b4, b5],  a4:b6] 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM