String.contains 找到了一个子字符串,但没有找到 Pattern.matches?

Posted

技术标签:

【中文标题】String.contains 找到了一个子字符串,但没有找到 Pattern.matches?【英文标题】:String.contains finds a substring but not 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 显然可以。您的“这是一个子字符串”显然是一个示例值。真正的价值是什么?它是否包含任何可能在正则表达式上下文中特殊的字符? 感谢您的帮助!我不知道换行符需要单独处理! 【参考方案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? 我的互联网连接有问题,我正在更新答案,但可能需要一些时间 谢谢!在我的子字符串之前有一些换行符!

以上是关于String.contains 找到了一个子字符串,但没有找到 Pattern.matches?的主要内容,如果未能解决你的问题,请参考以下文章

string.contains()

String.Contains 在 c# 中不需要参数吗?

如何在 Java 中的 String.contains() 方法中使用正则表达式

python判断字符串是否包含子字符串

LINQ / EF Core 不能在查询中使用 string.Contains

C# (String.StartsWith && !String.EndsWith && !String.Contains) 使用列表