Answers:
String.contains
与字符串,句点一起使用。它不适用于正则表达式。它将检查指定的确切字符串是否出现在当前字符串中。
注意,String.contains
不检查单词边界。它只是检查子字符串。
正则表达式比强大String.contains
,因为您可以在关键字上强制词边界(除其他外)。这意味着您可以将关键词搜索为单词,而不仅仅是子字符串。
使用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
。
.
通常匹配除 许多换行符以外的任何字符。(?s)
一开始会.
毫无例外地匹配任何字符(感谢Tim Pietzcker指出这一点)。
\\b
\
以指定单个\
,因此\\b
将被解释为\b
,如RAW正则表达式所示。\b
如上所述,匹配单词边界。
matcher.find()
做你需要的。例:
Pattern.compile("stores.*store.*product").matcher(someString).find();
您可以简单地使用matches
String类的方法。
boolean result = someString.matches("stores.*store.*product.*");
.*
否则只能匹配以开头的字符串stores
。
如果要使用正则表达式检查字符串是否包含子字符串,则最接近的方法是使用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.
注意matchs()和find()之间的区别,如果整个字符串与给定的模式匹配,matches()将返回true。find()尝试查找与给定输入字符串中的模式匹配的子字符串。同样,通过使用find(),您不必在正则表达式模式的开头添加-(?s)。*,在结尾添加。*之类的额外匹配项。
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.结果:正确
2.结果:正确
fromIndex
被忽略,不是吗?contains("something", test, 5) => true
(?s)
字符串包含换行符,则可能需要添加到正则表达式的开头。