上一篇博客我们讨论了Java中空正则表达式的匹配问题,其实用正则表达式"\\s"来匹配字符串也是存在一些问题的。
我们来看一段代码:
public static void main(String[] args) throws IOException {
File file = new File("./src/Try/text.txt");
BufferedReader bufr = new BufferedReader(new FileReader(file));
String line1 = bufr.readLine();
String line2 = bufr.readLine();
String line3 = bufr.readLine();
String pattern = "\\s";
Pattern p = Pattern.compile(pattern);
Matcher m1 = p.matcher(line1);
Matcher m2 = p.matcher(line2);
Matcher m3 = p.matcher(line3);
System.out.println(m1.find());
System.out.println(m2.find());
System.out.println(m3.find());
bufr.close();
}
text.txt文件内容如下(注意第一行是空行,第二行是一个空格):
代码中我们用"\\s"来分别匹配文件中的这三行。
输出结果分别为false、true、true。
"\\s"匹配第一行为为false的原因我们在上一篇博客里已经说过,是因为按行读取文件时,若读取的是空行,则读进来的字符串就是"",是不包含任何空白字符(如换行符、回车符等)的字符串,即使用"\\s"来匹配它也是false。
"\\s"匹配第二行为true是可以理解的,因为空格也是空白字符的一种,是可以被"\\s"匹配的。
但是,"\\s"匹配第三行也为true就很奇怪了,第三行我们的字符串明显不是空白字符,但是却可以被"\\s"匹配成功。由此我们推断,正则表达式"\\s"可以匹配任何非空字符串,我们在使用正则表达式的时候,要注意这一点,否则会使得一些非法的字符串也被成功匹配进来。