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

2022-09-03 06:14:30

假设,我有一个字符串:

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

我想在其中搜索一些符号,假设它将是.因此,我们有以下几点:"string"

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

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

Java文档说:

公共布尔匹配(字符串正则表达式)

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

它没有说

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

例如,在它将是:php

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

因此,两个正则表达式都将是 。
我认为这是正确的,因为如果我想测试整个字符串,我会做的truestr.matches("^string$");

附言:是的,我知道就是搜索子字符串,更简单快捷就会用到或者.我的问题只涉及Java正则表达式。str.indexOf("string")str.contains("string")


更新:正如@ChrisJester-Young(和@GyroGearless)所述,如果您想搜索主题字符串的一部分,其中一个解决方案是使用如下方法:regexfind()

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

答案 1

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


答案 2

正如您建议的文档,

公共布尔匹配(字符串正则表达式)

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

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

而不是它是否包含作为给定正则表达式实例的子字符串。正如 Chris 建议的那样,您可以使用 代替或者对于您的问题,您可以使用 。findcontains