Java: matching groups with regex

String s = "[{ \"op\": \"test\", \"path\": \"/abcd/1/key\", \"value\": \"ABCD\" },{ \"op\": \"replace\", \"path\": \"/efgh/1/key\", \"value\": \"EFGH\" }]";
The 2 strings i want to extract are the paths:  
/abcd/1/key
and
/efgh/1/key

I tried the code below but it only prints the second string, not both first and second:
String regex = "((.*)(path)(.*))";
Pattern pattern = Pattern.compile(regex);
                  Matcher m = pattern.matcher(s);
                  if (m.find()) {            
                        System.out.println("m.group(1)="+m.group(1)); //                        
                        System.out.println("m.group(2)="+m.group(2)); //                  
                        System.out.println("m.group(3)="+m.group(3)); //                        
                        System.out.println("m.group(4)="+m.group(4)); //             
                  }
renisenbbAsked:
Who is Participating?
 
Terry WoodsIT GuruCommented:
Try this pattern:
 String regex = "path\":\s*\"([^\"]*)";

Open in new window


The grouping might be a little different as I haven't nested brackets the same way as you, but hopefully you can figure that out easily enough.

The reason your pattern isn't working is because the .* parts are "consuming" as much as they possibly can, because they are "greedy". This means the first match consumes the entire string.
0
 
CEHJCommented:
[{ "op": "test", "path": "/abcd/1/key", "value": "ABCD" },{ "op": "replace", "path": "/efgh/1/key", "value": "EFGH" }]

Open in new window

Not a good idea to reinvent a JSON parser (as you've demonstrated) - use an existing one
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.