这几天在做《软件构造》这门课的实验时,需要用到正则表达式。具体操作是从一个文件中逐行读取数据,然后用正则表达式来匹配判断并提取数据。由于文件中存在空行,所以我就考虑到用空正则表达式""来匹配它,结果是可以匹配成功的,但是,当我用空正则表达式来匹配其它任何字符串时,竟然发现都能成功,这就不能达到通过匹配来筛选数据的目的了,只能另辟蹊径。
我们来写一些简单的测试代码验证一下。
首先我们用空正则表达式来匹配一下空行,看能不能成功,具体代码如下:
public static void main(String[] args) throws IOException {
File file = new File("./src/Try/text.txt");
BufferedReader bufr = new BufferedReader(new FileReader(file));
String line = bufr.readLine();
String pattern = "";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(line);
System.out.println(m.find());
bufr.close();
}
text.txt文件内容为(注意第一行为空行):
代码输出的结果为true,符合预期。
但是,经过验证,其它字符串用空正则表达式匹配也能成功。
我们把上述代码修改一下:
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 pattern = "";
Pattern p = Pattern.compile(pattern);
Matcher m1 = p.matcher(line1);
Matcher m2 = p.matcher(line2);
System.out.println(m1.find());
System.out.println(m2.find());
bufr.close();
}
这次我们把文件中的第二行也读进来,并用空正则表达式来匹配它。
我们会惊奇地发现两个输出都是true。
这就表明空正则表达式可以匹配其它的字符串,导致其它任何非法字符串也能匹配进来,所以我放弃了用空正则表达式来匹配空行。
于是,我就想用"\\s"来匹配空行,但是按行读取文件时,若读取的是空行,则读进来的字符串就是"",是不包含任何空白字符(如换行符、回车符等)的字符串,即使用"\\s"来匹配它也是false,我们看如下代码:
public static void main(String[] args) throws IOException {
File file = new File("./src/Try/text.txt");
BufferedReader bufr = new BufferedReader(new FileReader(file));
String line = bufr.readLine();
String pattern = "\\s";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(line);
System.out.println(m.find());
bufr.close();
}
此时我们用"\\s"来匹配文件中第一行的空行,执行如上代码,输出结果果然为false。
因此,我又想了另一个办法,既然用正则不行,我们就别用正则了。
当要判别读进来的是空行时,我们可以直接用if语句来判断,例如:if(line.equals(""))...。