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

    这几天在做《软件构造》这门课的实验时,需要用到正则表达式。具体操作是从一个文件中逐行读取数据,然后用正则表达式来匹配判断并提取数据。由于文件中存在空行,所以我就考虑到用空正则表达式""来匹配它,结果是可以匹配成功的,但是,当我用空正则表达式来匹配其它任何字符串时,竟然发现都能成功,这就不能达到通过匹配来筛选数据的目的了,只能另辟蹊径。

    我们来写一些简单的测试代码验证一下。

    首先我们用空正则表达式来匹配一下空行,看能不能成功,具体代码如下:

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(""))...。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值