javaregexstringregex-group

RegExpr output incorrect


I am trying to get all of the output from a string that I want to match a pattern using matcher, however, I am not sure that either the string or my pattern isn't correct. I am trying to get (Server: switch) as the first pattern and so on and so forth after the newline, however, I am only getting the last three pattern as my output shows. My output is the following with the code following

found_m: Message: Mess                                                                                                                          
found_m: Token: null                                                                                                                            
found_m: Response: OK

Here is my code:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "Server: Switch\nMessage: Mess\nToken: null\nResponse: OK";
      String pattern = "([\\w]+): ([^\\n]+)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
        while(m.find()) {
            System.out.println("found_m: " + m.group());
        }
      }else {
         System.out.println("NO MATCH");
      }
   }
}

Is my string line incorrect or my string pattern that I am not doing regexpr wrong?

Thanks in advance.


Solution

  • Your regex is almost correct.

    Problem is that you're calling find twice: 1st time in if condition and then again in while.

    You can use do-while loop instead:

    if (m.find( )) {
       do {
            System.out.println("found_m: " + m.group());
       } while(m.find());
    } else {
        System.out.println("NO MATCH");
    }
    

    For regex part you can use this with minor correction:

    final String pattern = "(\\w+): ([^\\n]+)";
    

    or if you don't need 2 capturing groups then use:

    final String pattern = "\\w+: [^\\n]+";
    

    As there is no need to use character class around \\w+