为什么我必须在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)
判断此字符串是否与给定的正则表达式匹配。
这意味着该字符串是否与给定的正则表达式匹配 。 即matches
validation您的字符串是否是给定正则表达式的实例 。
不是它是否包含一个子串,它是给定正则表达式的一个实例 。 正如克里斯建议你可以使用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
。 这适用于所有正则表达式。 虽然这不是这样做的方式,而是一个黑客。
可能还有更多解决方案。