Próbuję uzyskać wyszukiwanie bez rozróżniania wielkości liter z działającymi dwoma łańcuchami w JavaScript.
Normalnie byłoby tak:
var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
/i
Flaga byłaby dla wielkości liter.
Ale muszę szukać drugiego ciągu; bez flagi działa idealnie:
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);
Jeśli dodam /i
flagę do powyższego przykładu, szukałby łańcucha wyszukiwania, a nie tego, co jest w zmiennej „łańcuch wyszukiwania” (kolejny przykład nie działa):
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);
Jak mogę to osiągnąć?
źródło
string.match(/best/i);
.match
do porównania wartości logicznych. Wyszukiwanie wykracza poza pierwszy wynik. Musisz zatrzymać się po pierwszym meczu, który.test
lub.search
zrobisz. Sprawdź wydajność tutaj .toLowerCase
najprawdopodobniej nie przejdzie testu Turcji ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) i podobnych problemów z konwersją spraw. Nie jestem pewien, jakReGex
sobie z tym poradzi, ale gdybym musiał zgadywać, powiedziałbym lepiej.var text = "best"; var exp = new RegExp(test, "i");
. To jest to samo co/best/i
.Zastąpić
z
źródło
s = 'a[b'; r = new RegExp(s)
powoduje błąd składniowy (niezakończona klasa postaci)Jeśli szukasz tylko ciągu, a nie bardziej skomplikowanego wyrażenia regularnego, możesz użyć
indexOf()
- ale pamiętaj, aby najpierw napisać małe litery, ponieważindexOf()
rozróżnia małe i duże litery :Lub w jednym wierszu:
źródło
Załóżmy, że chcemy znaleźć zmienną
needle
łańcuchową w zmiennej łańcuchowejhaystack
. Istnieją trzy gotcha:string.toUpperCase
istring.toLowerCase
. Zamiast tego użyj wyrażenia regularnego, które ignoruje wielkość liter. Na przykład,var needleRegExp = new RegExp(needle, "i");
po którym następujeneedleRegExp.test(haystack)
.needle
. Uważaj, abyneedle
nie zawierało żadnych znaków specjalnych wyrażeń regularnych . Ucieczka za pomocąneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
ihaystack
, po prostu ignorując"^"
wielkość liter, upewnij się, że dodajesz na początku i"$"
na końcu konstruktora wyrażeń regularnych.Biorąc pod uwagę punkty (1) i (2), przykładem może być:
źródło
ES6 +:
includes()
zwraca,true
jeślisearchString
pojawia się na jednej lub kilku pozycjach lub wfalse
inny sposób.źródło
Jeśli martwisz się przypadkiem „niezakończonej klasy znaków”, pomocne byłoby usunięcie wszystkich znaków niealfanumerycznych:
źródło
Podoba mi się odpowiedź @ CHR15TO, w przeciwieństwie do innych odpowiedzi, które widziałem na inne podobne pytania, ta odpowiedź faktycznie pokazuje, jak właściwie uciec od ciągu wyszukiwania podanego przez użytkownika (zamiast mówić, że byłoby to konieczne bez pokazywania, jak to zrobić).
Jednak nadal jest dość niezgrabny i prawdopodobnie stosunkowo wolniejszy. Dlaczego więc nie mieć konkretnego rozwiązania tego, co prawdopodobnie jest wspólnym wymogiem dla programistów? (A dlaczego nie uwzględnić go w ESW API BTW?)
Moja odpowiedź [ https://stackoverflow.com/a/38290557/887092] na podobne pytanie umożliwia:
źródło
Istnieją dwa sposoby porównywania bez rozróżniania wielkości liter:
Konwertuj ciągi znaków na wielkie litery, a następnie porównuj je za pomocą ścisłego operatora (
===
). Jak surowy operator traktuje operandy czytać rzeczy na: http://www.thesstech.com/javascript/relational-logical-operatorsDopasowywanie wzorców za pomocą metod łańcuchowych:
Użyj metody „szukaj” w celu wyszukiwania bez rozróżniania wielkości liter. Przeczytaj o wyszukiwaniu i innych metodach ciągów na: http://www.thesstech.com/pattern-matching-using-string-methods
źródło
Robię to często i używam prostego 5-liniowego prototypu, który akceptuje varargs. Jest szybki i działa wszędzie .
źródło
Możesz zrobić wszystko małymi literami:
źródło
Zauważyłem, że jeśli użytkownik wpisze ciąg tekstu, ale opuści dane wejściowe bez wybrania którejkolwiek z opcji autouzupełniania, ukryta wartość wejściowa nie zostanie ustawiona, nawet jeśli ciąg znaków pokrywa się z jednym w tablicy. Tak więc przy pomocy innych odpowiedzi zrobiłem to:
źródło