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

我想检查一个string是否按顺序包含“stores”,“store”和“product”。 不pipe他们之间是什么

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

我需要显式声明一个正则expression式并将其传递给该方法,否则我无法传递一个正则expression式?

String.contains

String.contains适用于String,句点。 它不适用于正则expression式。 它将检查指定的string是否出现在当前string中。

请注意, String.contains不检查字边界; 它只是检查子string。

正则expression式解决scheme

正则expression式比String.contains更强大,因为您可以对关键字执行字边界(除其他外)。 这意味着您可以search关键字作为单词 ,而不仅仅是子string

使用下面的正则expression式使用String.matches

 "(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*" 

RAW正则expression式(删除在string文字中完成的转义 – 这是您在打印上面的string时得到的):

 (?s).*\bstores\b.*\bstore\b.*\bproduct\b.* 

\b检查字边界,以便您不会得到restores store products的匹配项。 请注意, stores 3store_product也被拒绝,因为数字和_被认为是一个单词的一部分,但我怀疑这种情况出现在自然文本。

由于双方检查字边界,上面的正则expression式将search确切的单词。 换句话说, stores stores product将不匹配上面的正则expression式,因为你正在寻找没有s store

. 通常匹配 一些新行字符 以外 的任何字符 。 (?s)在开始使. 匹配任何字符毫无例外(感谢蒂姆Pietzcker指出这一点)。

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

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

你可以简单地使用String类的matches方法。

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

如果你想检查一个string是否包含子string或不使用正则expression式,最接近你可以做的是通过使用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. 

如果整个string匹配给定的模式,请注意matches()和find()之间的区别,matches()返回true。 find()试图find一个匹配给定inputstring中的模式的子string。 另外通过使用find(),您不必在开始时添加额外的匹配,如 – (?s)。*,在正则expression式模式结尾。

 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(); } 

结果:真的

结果:真的