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


112

我想检查一个字符串是否按顺序包含单词“ stores”,“ store”和“ product”,无论它们之间是什么。

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

我是否需要显式声明一个正则表达式并将其传递给方法,还是可以完全不传递正则表达式?

Answers:


125

字符串包含

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指出这一点)。


7
如果(?s)字符串包含换行符,则可能需要添加到正则表达式的开头。
蒂姆·皮茨克


你能在这里解释一下第一个反斜杠\\b
vipin8169

1
@ vipin8169:在String中,您需要加倍\以指定单个\,因此\\b将被解释为\b,如RAW正则表达式所示。\b如上所述,匹配单词边界。
nhahtdh

如果需要匹配“ .mydomain”。在字符串中。那么它将如何更新正则表达式。我的用例是是否包含.mydomain的“ www.abc.mydomain.in.io”。是否
Manmohan Soni

111

matcher.find()做你需要的。例:

Pattern.compile("stores.*store.*product").matcher(someString).find();

4
爱这个。我发现匹配器的正则表达式过于复杂。
Mathter '16

21

您可以简单地使用matchesString类的方法。

boolean result = someString.matches("stores.*store.*product.*");

14
您需要以开头,.*否则只能匹配以开头的字符串stores
shmosel

尝试根据图案匹配整个区域。似乎@shmosel是正确的,不是吗?
Pieter De Bie

1
好吧,它只是匹配但不检查字符串是否在任何位置都包含模式。这不是OP寻找的解决方案,我建议优化regexp。
Gee Bee

2

如果要使用正则表达式检查字符串是否包含子字符串,则最接近的方法是使用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)。*,在结尾添加。*之类的额外匹配项。


2
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
PKeidel '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.