我想检查String是否按顺序包含单词“stores”,“store”和“product”。无论他们之间是什么。
我尝试使用someString.contains(stores%store%product);
和.contains("stores%store%product");
我是否需要明确声明一个正则表达式并将其传递给该方法,否则我根本无法传递正则表达式?
答案 0 :(得分:108)
String.contains
适用于String,句点。它不适用于正则表达式。它将检查指定的确切字符串是否出现在当前字符串中。
请注意String.contains
不会检查字边界;它只是检查子串。
正则表达式比String.contains
更强大,因为您可以对关键字(以及其他内容)强制执行单词边界。这意味着您可以将关键字搜索为 words ,而不仅仅是子串。
将String.matches
与以下正则表达式一起使用:
"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"
RAW正则表达式(删除字符串文字中的转义 - 这是您打印上面的字符串时得到的结果):
(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*
\b
会检查字边界,因此您无法获得restores store products
的匹配项。请注意stores 3store_product
也被拒绝,因为数字和_
被视为单词的一部分,但我怀疑这种情况会出现在自然文本中。
由于双方都检查了单词边界,因此上面的正则表达式将搜索确切的单词。换句话说,stores stores product
与上面的正则表达式不匹配,因为您正在搜索没有store
的单词s
。
.
通常匹配除 a number of new line characters之外的任何字符。开头(?s)
会使.
与任何角色完全匹配(感谢Tim Pietzcker指出这一点)。
答案 1 :(得分:86)
matcher.find()
做你需要的。例如:
Pattern.compile("stores.*store.*product").matcher(someString).find();
答案 2 :(得分:17)
您可以简单地使用String类的matches
方法。
boolean result = someString.matches("stores.*store.*product.*");
答案 3 :(得分:1)
public static void main(String[] args) {
String test = "something hear - to - find some to or tows";
System.out.println("1.result: " + contains("- to -( \\w+) som", test, null));
System.out.println("2.result: " + contains("- to -( \\w+) som", test, 5));
}
static boolean contains(String pattern, String text, Integer fromIndex){
if(fromIndex != null && fromIndex < text.length())
return Pattern.compile(pattern).matcher(text).find();
return Pattern.compile(pattern).matcher(text).find();
}
1.result:true
2.result:true
答案 4 :(得分:0)
如果要使用正则表达式检查字符串是否包含子字符串,则最接近的是使用find() -
private static final validPattern = "\\bstores\\b.*\\bstore\\b.*\\bproduct\\b"
Pattern pattern = Pattern.compile(validPattern);
Matcher matcher = pattern.matcher(inputString);
System.out.print(matcher.find()); // should print true or false.
注意match()和find()之间的区别,匹配()如果整个字符串与给定模式匹配则返回true。 find()尝试查找与给定输入字符串中的模式匹配的子字符串。另外,通过使用find(),您不必在开头添加额外的匹配,例如 - (?s)。*,在正则表达式模式的末尾添加。*。
答案 5 :(得分:0)
从 Java 11 开始,人们可以使用Pattern#asMatchPredicate
返回Predicate<String>
。
String string = "stores%store%product";
String regex = "stores.*store.*product.*";
Predicate<String> matchesRegex = Pattern.compile(regex).asMatchPredicate();
boolean match = matchesRegex.test(string); // true
该方法启用与其他String谓词的链接,只要Predicate
提供and
,or
和{ {1}}方法。
negate