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
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
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)^.*$
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.