假设我有一个字符串:
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
答案 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
。这适用于所有正则表达式。虽然这不是这样做的方式,而是黑客攻击。
可能还有更多解决方案。