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


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

Я пробовал использовать someString.contains(stores%store%product); и .contains("stores%store%product");

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

5 84

5 ответов:

строку.содержит

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

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

решение регулярное выражение

регулярное выражение является более мощным, чем String.contains, так как вы можете применить границу слова к ключевым словам (среди прочего). Это означает, что вы можете искать ключевые слова как слова, а не просто подстроки.

использовать String.matches со следующим регулярным выражением:

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

необработанное регулярное выражение (удалите экранирование, выполненное в строковом литерале - это то, что вы получаете, когда печатаете строку выше):

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

The \b проверяет границы слов, так что вы не получите совпадение для restores store products. Обратите внимание, что stores 3store_product также отклоняется, так как цифра и _ считаются частью слова, но Я сомневаюсь, что этот случай появится в естественном тексте.

так как граница слова проверяется для обеих сторон, регулярное выражение выше будет искать точные слова. Другими словами,stores stores product не будет соответствовать регулярному выражению выше, так как вы ищете слово store без s.

. обычно соответствует любому символу за исключениемряд новых символов строки. (?s) в начале делает . соответствует любому символу без исключений (спасибо Тим Pietzcker указывающих на это).

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

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

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

boolean result = someString.matches("stores.*store.*product.*");
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.результат: правда

Если вы хотите проверить, содержит ли строка подстроку или не использует регулярное выражение, Самое близкое, что вы можете сделать, это использовать 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.

обратите внимание на разницу между matches () и find (), matches () возвращает true, если вся строка соответствует заданному шаблону. найти() пытается найти подстроку, которая соответствует шаблону в данной строке ввода. Также с помощью find () вам не нужно добавлять дополнительные соответствия, такие как - (?с.)* в начале и .* в конце вашего шаблона регулярных выражений.