Як використовувати метод regex в методі String.contains () на Java


112

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

Я спробував використовувати someString.contains(stores%store%product);також.contains("stores%store%product");

Чи потрібно явно заявляти регулярний вираз і передавати його методу, чи я взагалі не можу передавати регулярний вираз?

Відповіді:


125

String.contains

String.containsпрацює зі String, період. Він не працює з регулярним виразом. Він перевірить, чи вказано точний рядок у поточному рядку чи ні.

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


7
Ви можете додати (?s)до початку свого регулярного виразу, якщо рядок містить нові рядки.
Тім Піцкер

я перевіряю його за такою URL-адресою >> магазини.nextag.com
store/

чи можете ви пояснити перший зворотний \\b
нахил

1
@ vipin8169: У String вам потрібно подвоїти значення, \щоб вказати єдине \, тому воно \\bбуде інтерпретуватися як \b, як видно з регулярного виразу RAW. \bвідповідає межі слова, як пояснено вище.
nhahtdh

якщо потрібно відповідати ".mydomain." в рядку. то як би оновити регулярний вираз. Моє використання - це "www.abc.mydomain.in.io", що містить .mydomain. чи ні
Манмохан Соні

111

matcher.find()робить те, що тобі було потрібно. Приклад:

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

4
Любіть цього. Я вважаю, що регулярний вираз математики є надто складним.
Mathter

21

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

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

14
Почати потрібно з .*цього рядка, або він буде відповідати лише рядкам, починаючи з stores.
shmosel

Спроби зіставити весь регіон із зразком. Здається, @shmosel має рацію, ні?
Пітер Де Бі

1
Ну, це просто збігається, але не перевіряє, чи містить рядок шаблон у будь-якій позиції. Це не рішення, яке шукає ОП, я пропоную уточнити регулярний вираз.
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.результат: вірно


fromIndexігнорується, чи не так? contains("something", test, 5) => true
PKeidel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.