如何在Java中的String.contains()方法中使用正则表达式

时间:2013-02-28 07:57:36

标签: java regex string

我想检查String是否按顺序包含单词“stores”,“store”和“product”。无论他们之间是什么。

我尝试使用someString.contains(stores%store%product);.contains("stores%store%product");

我是否需要明确声明一个正则表达式并将其传递给该方法,否则我根本无法传递正则表达式?

6 个答案:

答案 0 :(得分:108)

String.contains

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提供andor和{ {1}}方法。

negate