在我的一个try / catch块中,我捕到异常e
,并且:
e.toString().contains("this is a substring")
返回true
,而
Pattern.matches(".*this is a substring.*", e.toString())
返回false
为什么会这样?包括.*
作为正则表达式模式的前缀和后缀应该基本上使这两个函数做同样的事情吗?
答案 0 :(得分:6)
如果您的输入字符串包含换行符号,则.*
中的.matches()
是不够的,需要完整字符串匹配。
因此,您需要一个DOTALL修饰符:
Pattern.matches("(?s).*this is a substring.*", e.toString())
^^^^
在dotall模式下,表达式
.
匹配任何字符,包括行终止符。默认情况下,此表达式与行终止符不匹配。也可以通过嵌入式标志表达式
(?s)
启用Dotall模式。 (s
是“单行”模式的助记符,这是在Perl中调用的。)
注意:如果您需要检查较长字符串中是否存在文字子字符串,.contains()
方法应该更快。或者,如果您需要不区分大小写的contains
,也可以选中StringUtils.containsIgnoreCase
。