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 :
JavaScript
x
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:
JavaScript
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.
JavaScript
String str = "g, i+, w+ | (d | (u+, f))+";
String[] chunks = str.split("[\s,]+|(?<![\s,])(?![\s,])");
System.out.println(String.join(",", chunks));
Output
JavaScript
g,i,+,w,+,|,(,d,|,(,u,+,f,),),+
Alternative: Search for what you want, and collect it into an array or List
(requires Java 9):
JavaScript
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:
JavaScript
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
JavaScript
[g, i, +, w, +, |, (, d, |, (, u, +, f, ), ), +]
You can always convert the List
to an array:
JavaScript
String[] chunks = chunkList.toArray(new String[0]);