如何在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(); }
结果:真的
结果:真的