How to use java regex to match a line

The raw data is:

auser1 home1b
auser2 home2b
auser3 home3b

I want to match a line, but it doesn't work using ^(.*?)$

However, I can use a(.*?)b to match user1 home1.

How can I match auser1 home1b


By default, ^ and $ match the start- and end-of-input respectively. You'll need to enable MULTI-LINE mode with (?m), which causes ^ and $ to match the start- and end-of-line:

(?m)^.*$

The demo:

import java.util.regex.*;

public class Main {
    public static void main(String[] args) throws Exception {

        String text = "auser1 home1b\n" +
                "auser2 home2b\n" +
                "auser3 home3b";

        Matcher m = Pattern.compile("(?m)^.*$").matcher(text);

        while (m.find()) {
            System.out.println("line = " + m.group());
        }
    }
}

produces the following output:

line = auser1 home1b
line = auser2 home2b
line = auser3 home3b

EDIT I

The fact that ^.*$ didn't match anything is because the . by default doesn't match \r and \n. If you enable DOT-ALL with (?s), causing the . to match those as well, you'll see the entire input string being matched:

(?s)^.*$

EDIT II

In this case, you mind as well drop the ^ and $ and simply look for the pattern .*. Since . will not match \n, you'll end up with the same matches when looking for (?m)^.*$, as @Kobi rightfully mentioned in the comments.


we can also use the flag MULTILINE,

 Matcher m = Pattern.compile("^.*$",Pattern.MULTILINE).matcher(text);

This will enable the multiline mode which will gave you the expected result.