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

112

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

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

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

vipin8169
источник

Ответы:

125

String.contains

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

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

Решение Regex

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

nhahtdh
источник
7
Вы можете добавить (?s)в начало вашего регулярного выражения, если строка содержит символы новой строки.
Тим Пицкер
я проверяю его по URL-адресу, подобному этому >> store.nextag.com/store/4908844/product/1070625777/…
vipin8169
\\b
Можете
1
@ vipin8169: в String вам нужно удвоить, \чтобы указать сингл \, поэтому \\bон будет интерпретироваться как \b, как видно в регулярном выражении RAW. \bсоответствует границе слова, как описано выше.
nhahtdh
если необходимо сопоставить ".mydomain." в строке. тогда как бы он обновил регулярное выражение. Мой вариант использования: "www.abc.mydomain.in.io" содержит домен .mydomain. или нет
Soni
111

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

Pattern.compile("stores.*store.*product").matcher(someString).find();
Евгений82
источник
4
Нравится вот этот. Я считаю регулярное выражение сопоставления слишком сложным.
Mathter
21

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

boolean result = someString.matches("stores.*store.*product.*");
san1deep2set3hi
источник
14
Вам нужно начать с, .*иначе будут найдены только строки, начинающиеся с stores.
shmosel
Попытки сопоставить весь регион с шаблоном. Похоже, что @shmosel прав, нет?
Питер Де Би
1
Ну, он просто совпадает, но не проверяет, содержит ли строка шаблон в какой-либо позиции. Это не решение, которое ищет OP, я предлагаю уточнить регулярное выражение.
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.

Обратите внимание на разницу между функциями match () и find (), match () возвращает 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. результат: верно

Ar maj
источник
fromIndexигнорируется, не так ли? contains("something", test, 5) => true
PKeidel