原始数据是:
auser1 home1b
auser2 home2b
auser3 home3b
我想匹配一行,但使用^(.*?)$
但是,我可以使用a(.*?)b
来匹配user1 home1
。
如何匹配auser1 home1b
答案 0 :(得分:52)
默认情况下,^
和$
分别匹配输入的开始和结束。您需要使用(?m)
启用MULTI-LINE模式,这会导致^
和$
匹配开头和结尾:
(?m)^.*$
演示:
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());
}
}
}
产生以下输出:
line = auser1 home1b line = auser2 home2b line = auser3 home3b
^.*$
与任何内容不匹配的事实是因为默认情况下.
与\r
和\n
不匹配。如果您使用(?s)
启用DOT-ALL,导致.
也匹配,那么您将看到匹配的整个输入字符串:
(?s)^.*$
在这种情况下,您还要注意放弃^
和$
,只需查找模式.*
即可。由于.
与\n
不匹配,因此在查找(?m)^.*$
时,您最终会得到相同的匹配,正如评论中正确提到的@Kobi。
答案 1 :(得分:1)
我们还可以使用标志MULTILINE
Matcher m = Pattern.compile("^.*$",Pattern.MULTILINE).matcher(text);
这将启用多行模式,这将为您提供预期的结果。