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

时间:2016-07-04 11:10:18

标签: java regex

假设我有一个字符串:

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

3 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:3)

作为您建议的文档,

  

public boolean matches(String regex)

     

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

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

是否包含子字符串,该子字符串是给定正则表达式的实例。正如克里斯建议您可以使用find代替问题或使用contains

答案 2 :(得分:0)

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

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

  

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

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

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

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

可能还有更多解决方案。