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

spi*_*rit 14 java regex

假设,我有一个字符串:

String str = "some strange string with searched symbol";
Run Code Online (Sandbox Code Playgroud)

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

str.matches("string"); //false
str.matches(".*string.*"); //true
Run Code Online (Sandbox Code Playgroud)

那么,正如标题中所述,为什么我必须在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)
Run Code Online (Sandbox Code Playgroud)

所以,两个正则表达式都将是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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 17

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

  • 你的意思是:`Pattern.compile("string").matcher(str).find()`? (2认同)