I’m trying to split a string with special characters and not being able to split the parentheses properly. This the code I’m trying :
class Ione
{
public static void main (String[] args) throws java.lang.Exception
{
String str = "g, i+, w+ | (d | (u+, f))+";
String[] chunks = str.split(",\s+|(?=\W)");
for(int q=0; q<chunks.length; q++) {
System.out.println(""+chunks[q]);
}
}
}
The regex does not split the starting parentheses (
I’m trying to get the following output:
g,i,+,w,+,|,(,d,|,(,u,+,f,),),+
Could someone please help me. Thank you.
Advertisement
Answer
So you want to use split() to get every character separately, except for spaces and commas, so split by spaces/commas and by “nothing”, i.e. the zero-width “space” between non-space/comma characters.
String str = "g, i+, w+ | (d | (u+, f))+";
String[] chunks = str.split("[\s,]+|(?<![\s,])(?![\s,])");
System.out.println(String.join(",", chunks));
Output
g,i,+,w,+,|,(,d,|,(,u,+,f,),),+
Alternative: Search for what you want, and collect it into an array or List (requires Java 9):
String str = "g, i+, w+ | (d | (u+, f))+";
String[] chunks = Pattern.compile("[^\s,]").matcher(str).results()
.map(MatchResult::group).toArray(String[]::new);
System.out.println(String.join(",", chunks));
Same output.
For older versions of Java, use a find() loop:
String str = "g, i+, w+ | (d | (u+, f))+";
List<String> chunkList = new ArrayList<>();
for (Matcher m = Pattern.compile("[^\s,]").matcher(str); m.find(); )
chunkList.add(m.group());
System.out.println(chunkList);
Output
[g, i, +, w, +, |, (, d, |, (, u, +, f, ), ), +]
You can always convert the List to an array:
String[] chunks = chunkList.toArray(new String[0]);
