Jak używać wyrażenia regularnego w metodzie String.contains () w Javie


112

Chcę sprawdzić, czy ciąg zawiera słowa „sklepy”, „sklep” i „produkt” w tej kolejności, bez względu na to, co jest między nimi.

Próbowałem używać, someString.contains(stores%store%product);a także.contains("stores%store%product");

Czy muszę jawnie zadeklarować wyrażenie regularne i przekazać je do metody, czy w ogóle nie mogę przekazać wyrażenia regularnego?

Odpowiedzi:


125

String.contains

String.containsdziała z String, kropka. To nie działa z wyrażeniem regularnym. Sprawdza, czy dokładny określony ciąg pojawia się w bieżącym ciągu, czy nie.

Zauważ, że String.containsnie sprawdza granicy słów; po prostu sprawdza podciąg.

Rozwiązanie Regex

Regex jest potężniejszy niż String.contains, ponieważ możesz wymusić granice słów na słowach kluczowych (między innymi). Oznacza to, że możesz wyszukiwać słowa kluczowe jako słowa , a nie tylko podciągi .

Użyj String.matchesz następującym wyrażeniem regularnym:

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

Wyrażenie regularne RAW (usuń znaki ucieczki wykonane w literale ciągu - oto, co otrzymujesz po wydrukowaniu powyższego ciągu):

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

Te \bkontrole na granicy słowa, tak, aby nie dostać się do meczu restores store products. Zauważ, że stores 3store_productjest to również odrzucane, ponieważ cyfry i _są uważane za część słowa, ale wątpię, aby ten przypadek pojawił się w tekście naturalnym.

Ponieważ granica słowa jest sprawdzana po obu stronach, powyższe wyrażenie regularne będzie wyszukiwać dokładne słowa. Innymi słowy, stores stores productnie będzie pasować do powyższego wyrażenia regularnego, ponieważ szukasz słowa storebez s.

.normalnie dopasowuje dowolny znak poza liczbą znaków nowego wiersza . (?s)na początku .dopasowuje każdą postać bez wyjątku (podziękowania dla Tima Pietzckera za zwrócenie uwagi).


7
Możesz chcieć dodać (?s)na początku swojego wyrażenia regularnego na wypadek, gdyby ciąg zawierał nowe linie.
Tim Pietzcker


czy możesz wyjaśnić pierwszy ukośnik odwrotny tutaj\\b
vipin8169

1
@ vipin8169: W łańcuchu musisz podwoić wartość, \aby określić pojedynczy \, więc \\bzostanie zinterpretowany jako \b, jak widać w wyrażeniu regularnym RAW. \bdopasowuje granicę słowa, jak wyjaśniono powyżej.
nhahtdh

jeśli trzeba dopasować „.moja_domena”. w sznurku. to w jaki sposób zaktualizuje to wyrażenie regularne. Moim przypadkiem jest to, czy „www.abc.mydomain.in.io” zawiera .mojadomena. czy nie
Manmohan Soni

111

matcher.find()robi to, czego potrzebujesz. Przykład:

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

4
Kocham tą jedną. Uważam, że wyrażenie regularne matchera jest zbyt skomplikowane.
Mathter

21

Możesz po prostu użyć matchesmetody klasy String.

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

14
Musisz zacząć od .*lub dopasuje tylko ciągi zaczynające się od stores.
shmosel

Próbuje dopasować cały region do wzorca. Wygląda na to, że @shmosel ma rację, prawda?
Pieter De Bie

1
Cóż, po prostu pasuje, ale nie sprawdza, czy ciąg zawiera wzorzec w dowolnej pozycji. Nie jest to rozwiązanie, którego szuka OP, proponuję doprecyzować wyrażenie regularne.
Gee Bee

2

Jeśli chcesz sprawdzić, czy ciąg zawiera podłańcuch, czy nie za pomocą wyrażenia regularnego, najbliższe co możesz zrobić, to użyć 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.

Zwróć uwagę na różnicę między match () a find (), match () zwraca prawdę, jeśli cały ciąg pasuje do podanego wzorca. find () próbuje znaleźć podciąg, który pasuje do wzorca w podanym ciągu wejściowym. Również używając find () nie musisz dodawać dodatkowego dopasowania, takiego jak - (? S). * Na początku i. * Na końcu wzorca wyrażenia regularnego.


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. wynik: prawda

2. wynik: prawda


fromIndexjest ignorowane, prawda? contains("something", test, 5) => true
PKeidel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.