为什么我必须在Java正则表达式中指定整个字符串?

假设,我有一个字符串:

String str = "some strange string with searched symbol"; 

我想在其中搜索一些符号,假设它将是"string" 。 所以我们有以下内容:

 str.matches("string"); //false str.matches(".*string.*"); //true 

那么,正如标题中所述, 为什么我必须在Java正则表达式中指定整个字符串?

Java文档说:

public boolean matches(String regex)

判断此字符串是否与给定的正则表达式匹配。

它没有说

判断整个字符串是否与给定的正则表达式匹配。

例如,在php它将是:

 $str = "some strange string with searched symbol"; var_dump(preg_match('/string/', $str)); // int(1) var_dump(preg_match('/.*string.*/', $str)); //int(1) 

所以,两个正则表达式都是true
而且我认为这是正确的,因为如果我想测试整个字符串,我会做str.matches("^string$");

PS:是的,我知道这是搜索子字符串 ,更简单,更快将使用str.indexOf("string")str.contains("string") 。 我的问题只涉及Java正则表达式。


更新 :如@ ChrisJester-Young(和@GyroGearless)所述,其中一个解决方案,如果你想搜索属于主题字符串的regex ,就是使用这样的find()方法:

  String str = "some strange string with searched symbol"; Matcher m = Pattern.compile("string").matcher(str); System.out.println(m.find()); //true 

matches始终匹配整个输入字符串。 如果要允许子字符串匹配,请使用find

作为您建议的文档,

public boolean matches(String regex)

判断此字符串是否与给定的正则表达式匹配。

这意味着该字符串是否与给定的正则表达式匹配 。 即matchesvalidation您的字符串是否是给定正则表达式的实例

不是它是否包含一个子串,它是给定正则表达式的一个实例 。 正如克里斯建议你可以使用find而不是你的问题,你可以使用contains

是的,正如您已经知道的那样(现在) matches()将仅对完整的字符串返回true。

但是,在您的更新中,您已声明:

正如@ ChrisJester-Young(和@GyroGearless)所述, 唯一的解决方案,如果你想搜索属于主题字符串的正则表达式,就是使用find()方法……

我想说使用find() 不是唯一的解决方案 。 还有至少一个,我知道:

 String str = "some strange string with searched symbol"; boolean found = str.split("string").length>1; System.out.println(found); 

这打印true 。 这适用于所有正则表达式。 虽然这不是这样做的方式,而是一个黑客。

可能还有更多解决方案。