一、问题

在工作中处理BUG时发现是因为正则匹配没有成功,最后分析是因为测试使用的输入内容中包含了换行符。

  • 模拟场景

业务上需要判断输入表达式中是否有指定的格式,如果有则需要调用相应的方法解析。

String regex = ".*\\$\\{\\s*user\\..+?\\s*\\}.*";
String expression = FileUtils.readFileToString(new File("G:/demo/content.txt"), "UTF-8");

System.out.println(expression.matches(regex));//false
System.out.println(expression.replaceAll("\r\n", "").matches(regex));//true
  • 表达式内容

content.txt中的文件内容如下,此内容为模拟内容,业务上使用的表达式内容比较多,不容易看出里面包含换行。

查询到:${user.name} 的 ${user.billno} 还未处理,请尽快处理。
过期时间:${time}
  • 运行结果
fasle
true

二、解决办法

使用Pattern和Matcher来检查输入中是否包含指定格式的表达式:

Pattern pattern = Pattern.compile("\\$\\{\\s*user\\..+?\\s*\\}");
Matcher matcher = pattern.matcher(expression);
if(matcher.find()){
	//do something
}