【问题标题】:String.contains finds a substring but not Pattern.matches?String.contains 找到了一个子字符串,但没有找到 Pattern.matches?
【发布时间】:2016-11-24 16:40:05
【问题描述】:

在我的一个 try/catch 块中,我捕获了一个异常 e,这是:

e.toString().contains("this is a substring") 返回true

同时

Pattern.matches(".*this is a substring.*", e.toString()) 返回false

为什么会这样?包括.* 作为正则表达式模式的前缀和后缀应该基本上使这两个函数做同样的事情吧?

【问题讨论】:

  • 显示使用完整的e.toString()
  • 不,不必。您的字符串中是否有换行符? e.toString() 是什么?
  • contains 不适用于正则表达式,matches 显然可以。您的“这是一个子字符串”显然是一个示例值。真正的价值是什么?它是否包含任何可能在正则表达式上下文中特殊的字符?
  • 感谢您的帮助!我不知道换行符需要单独处理!

标签: java regex string contains


【解决方案1】:

如果您的输入字符串包含换行符,.*.matches() 中是不够的,需要完整的字符串匹配。

因此,您需要一个 DOTALL 修饰符:

Pattern.matches("(?s).*this is a substring.*", e.toString())
                 ^^^^ 

Java regex reference

在 dotall 模式下,表达式 . 匹配任何字符,包括行终止符。默认情况下,此表达式不匹配行终止符。

Dotall 模式也可以通过嵌入式标志表达式(?s) 启用。 (s 是“单行”模式的助记符,在 Perl 中就是这样称呼的。)

注意:如果您需要检查较长字符串中是否存在文字子字符串,.contains() 方法应该更快。或者,如果您需要不区分大小写的contains,也可以检查StringUtils.containsIgnoreCase

【讨论】:

  • 我建议你称它为“DOTALL 嵌入标志表达式”,因为它被称为in the Javadoc
  • 我的互联网连接有问题,我正在更新答案,但可能需要一些时间
  • 谢谢!在我的子字符串之前有一些换行符!
猜你喜欢
  • 2020-05-16
  • 2013-06-18
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 2019-02-15
相关资源
最近更新 更多