2010-10-07 16 views
9

Jeśli szukam konkretnego słowa w ciągu znaków, na przykład w ciągu "Jak się masz", szukam "są". Czy regularne indexOf() działa szybciej i lepiej lub mecz Regex()Wyszukaj słowo w ciągu znaków

String testStr = "how are you"; 
String lookUp = "are"; 

//METHOD1 
if (testStr.indexOf(lookUp) != -1) 
{ 
System.out.println("Found!"); 
} 

//OR 
//METHOD 2 
if (testStr.match(".*"+lookUp+".*")) 
{ 
System.out.println("Found!"); 
} 

Który z dwóch powyższych sposobów jest lepszy sposób patrzenia na sznurku wewnątrz innego łańcucha? A może jest o wiele lepsza alternatywa?

  • Ivard
+0

Czy to nie jest dokładną kopią tego: http://stackoverflow.com/q/3876246/450398 – Grodriguez

+0

W j2se 1.6 nową metodą jest String.maches zamiast http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#matches(java.lang.String) –

Odpowiedz

16

Jeśli nie obchodzi, czy to faktycznie cała słowo jesteś dopasowanie, a następnie indexOf() będzie dużo szybciej.

Jeśli, z drugiej strony, trzeba być w stanie odróżnić are, harebrained, aren't itd., To trzeba regex: \bare\b będzie tylko dopasować are jako całe słowo (\\bare\\b w Javie).

\b jest kotwicą granicę słów i pasuje do pustej przestrzeni między znakiem alfanumerycznym (litera, cyfra lub podkreślenie) a znakiem niealfanumerycznym.

Zastrzeżenie: Oznacza to również, że jeśli termin wyszukiwarka nie jest w rzeczywistości słowo (powiedzmy szukasz ###), a następnie te słowo kotwice brzegowe będą pasować tylko w sznurku jak aaa###zzz, ale nie w +++###+++.

Dalsze zastrzeżenie: Java ma domyślnie ograniczony światopogląd co stanowi znak alfanumeryczny. W tym miejscu liczą się tylko litery/cyfry ASCII (plus podkreślenie), więc kotwice granic słów zawiedzie w słowach takich jak élève, lub ärgern. Read more about this (and how to solve this problem) here.

1

Metoda pierwsza powinna być szybsza, ponieważ ma mniejszy narzut. jeśli chodzi o wydajność wyszukiwania w dużych plikach, wyspecjalizowana metoda, taka jak boyer moore pattern matching, może prowadzić do dalszych ulepszeń.

+0

Za tak e powodu link nie jest wyświetlany http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm – stacker

+0

Myślnik w 'Boyer-M oore' było naprawdę en-dash ('U + 2013'). Nie wiem od ręki, jeśli jest to legalne w adresie URL, ale SO nie wydaje się to podoba. –

0

Jeśli szukasz w górę o jedną ciąg wewnątrz innego należy używać indexOf lub contains metody. Przykład: Sprawdź, czy "foo" jest obecny w ciągu znaków.

Ale jeśli szukasz wzoru wzór użyj metody match.
Przykład: Sprawdź, czy "foo" jest obecny na początku/końca ciągu. Lub sprawdź, czy jest ono obecne jako całe słowo w całości:.

Metoda prostego wyszukiwania ciągów za pomocą metodynie jest wydajna ze względu na obciążenie silnika regex.

0

Pierwsza metoda jest szybsza, a ponieważ nie jest złożonym wyrażeniem, nie ma powodu, aby używać tutaj wyrażenia regularnego.

1

Jeśli szukasz stałego ciągu znaków, a nie wzoru, jak w przykładzie w pytaniu, indexOf będzie lepszy (prostszy) i szybszy, ponieważ nie musi używać wyrażeń regularnych.

Ponadto, jeśli poszukiwany ciąg znaków zawiera znaki, które mają specjalne znaczenie w wyrażeniach regularnych, z indexOf nie musisz się martwić, że unikniesz tych znaków.

W miarę możliwości używaj indexOf i match do dopasowywania wzorców, gdzie indexOf nie może zrobić tego, czego potrzebujesz.

0

oczywiście indexOf() jest lepsza niż match(). jeden "mecz()" składa się z wielu porównań: a == a, r == r, e == e; w tym samym czasie, można dołączyć symboli wieloznacznych, które można podzielić na wiele spraw:


  1. ?? są
    ??? są
    ???? są
    ..... ... są? są? są ???

, dopóki nie będzie tak długa, jak oryginalne ciągi.

0

Twoje pytanie praktycznie odpowiada samo; jeśli musisz zapytać, czy regex jest lepszym wyborem, prawie na pewno nie jest. Ponadto, wybierając między rozwiązaniem regex i non-regex, wydajność nigdy nie powinna być podstawowym kryterium. Poczekaj, aż uzyskasz działający kod i zapisz go.

0

Lepszym podejściem do porównywania obu wersji jest analiza kodu źródłowego metody indexOf i samych metod regex.matches, obliczanie czasu wykonywania obu implementacji algorytmu w Big_O_notation i porównywanie ich najlepszych, średnich i najgorszych przypadków (znaleziono sekwencję odpowiednio na początku, środku lub końcu łańcucha). Kod źródłowy jest tutaj indexOf_source i tutaj regex.matches. Musimy wykonać analizę czasu wykonywania obu, aby zobaczyć, co dokładnie robi. Hektyczne zadanie, ale to jedyny sposób, aby dokonać prawdziwego porównania, a reszta to tylko założenia. Dobre pytanie.

0

używam go:

public boolean searchStr(String search, String what) { 
    if(!search.replaceAll(what,"_").equals(search)) { 
     return true; 
    } 
    return false; 
} 

Przykład użycia:

String s = "abc"; 
String w = "bc"; 
if(searchStr(s,w)) { 
    //this returns true 
} 
s="qwe"; 
w="asd"; 
if(searchStr(s,w)) { 
    //this returns false 
} 
+1

Witaj na stronie SO, tutaj dobrze jest wyjaśnić, dlaczego używać rozwiązania, a nie tylko jak. To sprawi, że twoja odpowiedź będzie bardziej wartościowa i pomoże dalszemu czytelnikowi lepiej zrozumieć, jak to robisz. Proponuję również zapoznać się z naszym FAQ: http://stackoverflow.com/faq. – ForceMagic

Powiązane problemy