Mam następujące:
if (referrer.indexOf("Ral") == -1) { ... }
Co lubię robić to, aby Ral
wielkość liter ma znaczenie, tak że może być RAl
, rAl
itp i nadal pasuje.
Czy istnieje sposób, aby powiedzieć, że Ral
musi być rozróżniana wielkość liter?
javascript
string
case-sensitive
case-insensitive
Nate Pet
źródło
źródło
RegExp
bezpośrednio na podstawie danych wprowadzonych przez użytkownika. Na przykład użytkownik może wprowadzić,*
a konstruktor zgłosi błądRegExp
. Przyjęte rozwiązanie nie ma tego problemu.Odpowiedzi:
Dodaj
.toLowerCase()
poreferrer
. Ta metoda zamienia ciąg znaków na ciąg małych liter. Następnie użyj.indexOf()
za pomocąral
zamiastRal
.To samo można również osiągnąć za pomocą wyrażenia regularnego (szczególnie przydatne, gdy chcesz przetestować wzorce dynamiczne):
źródło
toLocaleLowerCase()
( ref ).search
:var index = referrer.search(/Ral/i);
Inną opcją jest użycie metody wyszukiwania w następujący sposób:
Wygląda bardziej elegancko niż konwersja całego łańcucha na małe litery i może być bardziej wydajny.
Gdy
toLowerCase()
kod ma dwa przejścia nad ciągiem, jedno przejście znajduje się na całym ciągu, aby przekonwertować go na małe litery, a drugie na poszukiwanie pożądanego indeksu.Z
RegExp
kodem wystarczy jedno przejście przez ciąg, który wygląda tak, aby pasował do pożądanego indeksu.Dlatego na długich ciągach polecam używać
RegExp
wersji (wydaje mi się, że na krótkich ciągach ta wydajność zależy od utworzeniaRegExp
obiektu)źródło
Użyj RegExp:
Lub użyj
.toLowerCase()
:źródło
Od ES2016 możesz także zastosować nieco lepszą / łatwiejszą / bardziej elegancką metodę (z uwzględnieniem wielkości liter):
lub (bez rozróżniania wielkości liter):
Oto porównanie
.indexOf()
i.includes()
: https://dev.to/adroitcoder/includes-vs-indexof-in-javascriptźródło
includes
jest wielkość liter w Chrome: Spróbuj'fooBar'.includes('bar')
==>false
Istnieje tutaj kilka podejść.
Jeśli chcesz wykonać rozróżnianie wielkości liter dla tylko tego wystąpienia, wykonaj następujące czynności:
Ewentualnie, jeśli przeprowadzasz tę kontrolę regularnie, możesz dodać do niej nową
indexOf()
metodęString
, ale nie rozróżniaj wielkości liter.źródło
defineProperty
Proponuję dla nowoczesnych przeglądarek, które obsługująObject.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});
. Dwie aktualizacje: Jawna konwersja ciągu przy użyciu(s+'')
i niepoliczalna w pętli (for(var i in '') ...
nie pokazujeindexOfInsensitive
.źródło
Możesz tego spróbować
źródło
Przykład dla dowolnego języka:
źródło
Jest rok 2016 i nie ma jasnego sposobu, jak to zrobić? Miałem nadzieję na copypastę. Spróbuję.
Uwagi do projektu: Chciałem zminimalizować zużycie pamięci, a tym samym poprawić szybkość - aby nie było kopiowania / mutowania ciągów. Zakładam, że V8 (i inne silniki) mogą zoptymalizować tę funkcję.
Mój powód dla nazwy:
Dlaczego nie...:
toLowerCase()
- potencjalne powtarzające się wywołania toLowerCase na tym samym łańcuchu.RegExp
- niewygodne wyszukiwanie ze zmienną. Nawet obiekt RegExp jest niezręczny, gdy trzeba uciec od znakówźródło
Aby przeprowadzić lepsze wyszukiwanie, użyj następującego kodu:
W pierwszym alertie () JavaScript zwrócił „-1” - innymi słowy, indexOf () nie znalazł dopasowania: dzieje się tak po prostu dlatego, że „JavaScript” jest zapisany małymi literami w pierwszym ciągu znaków, a odpowiednio dużymi literami w drugim. Aby wyszukiwać bez rozróżniania wielkości liter za pomocą indexOf (), możesz utworzyć oba ciągi wielkimi lub małymi literami. Oznacza to, że podobnie jak w drugim alertie () JavaScript będzie sprawdzał tylko występowanie szukanego ciągu, wielkie litery są ignorowane.
Odniesienie, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm
źródło
Jeśli
referrer
jest tablicą, możesz użyćfindIndex()
źródło
Oto moje zdanie:
Skrypt :
HTML:
Codepen
źródło