Как использовать регулярное выражение в методе String.contains() в Java

Я хочу проверить, содержит ли строка String слова "store", "store" и "product" в этом порядке. Независимо от того, что находится между ними.

Я попытался использовать someString.contains(stores%store%product);, а также .contains("stores%store%product");

Мне нужно явно объявить регулярное выражение и передать его методу, или я не могу вообще передать регулярное выражение?

Ответ 1

String.contains

String.contains работает со строкой, периодом. Он не работает с регулярным выражением. Он проверяет, отображается ли точная строка в текущей строке или нет.

Обратите внимание, что String.contains не проверяет границы слова; он просто проверяет подстроку.

Регрессивное решение

Regex является более мощным, чем 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) в начале делает . соответствует любому символу без исключения (спасибо Тиму Пицкеру за указание этого).

Ответ 2

matcher.find() делает то, что вам нужно. Пример:

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

Ответ 3

Вы можете просто использовать метод matches для класса String.

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

Ответ 4

Если вы хотите проверить, содержит ли строка подстроку или нет с помощью regex, то самое близкое, что вы можете сделать, это использовать 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(), matches() возвращает true, если вся строка соответствует заданному шаблону. find() пытается найти подстроку, которая соответствует шаблону в заданной строке ввода. Кроме того, с помощью функции find() вам не нужно добавлять дополнительное соответствие, например - (? S). * В начале и. * В конце вашего шаблона регулярного выражения.

Ответ 5

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