Java中正则表达式"\\s"的匹配问题

    上一篇博客我们讨论了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文件内容如下(注意第一行是空行,第二行是一个空格):

Java中正则表达式

    代码中我们用"\\s"来分别匹配文件中的这三行。

    输出结果分别为false、true、true。

    "\\s"匹配第一行为为false的原因我们在上一篇博客里已经说过,是因为按行读取文件时,若读取的是空行,则读进来的字符串就是"",是不包含任何空白字符(如换行符、回车符等)的字符串,即使用"\\s"来匹配它也是false。

    "\\s"匹配第二行为true是可以理解的,因为空格也是空白字符的一种,是可以被"\\s"匹配的。

    但是,"\\s"匹配第三行也为true就很奇怪了,第三行我们的字符串明显不是空白字符,但是却可以被"\\s"匹配成功。由此我们推断,正则表达式"\\s"可以匹配任何非空字符串,我们在使用正则表达式的时候,要注意这一点,否则会使得一些非法的字符串也被成功匹配进来。

你可能感兴趣的:(Java中正则表达式"\\s"的匹配问题)