Nie możesz tego zrobić, switch
chyba że wykonujesz pełne dopasowanie ciągów; to robi dopasowanie podciągów . (To nie do końca prawda, jak zauważa Sean w komentarzach. Patrz uwaga na końcu).
Jeśli jesteś szczęśliwy, że wyrażenie regularne u góry usuwa wszystkie elementy, których nie chcesz porównywać w dopasowaniu, nie potrzebujesz dopasowania do podciągów i możesz:
switch (base_url_string) {
case "xxx.local":
// Blah
break;
case "xxx.dev.yyy.com":
// Blah
break;
}
... ale znowu działa to tylko wtedy, gdy jest to pełny ciąg, który pasujesz. Nie powiedzie się, jeśli base_url_string
powiedzmy „yyy.xxx.local”, podczas gdy twój obecny kod byłby zgodny z tym w gałęzi „xxx.local”.
Aktualizacja : Ok, więc technicznie ty może użyć switch
do podciągu dopasowania, ale nie polecam go w większości sytuacji. Oto jak ( przykład na żywo ):
function test(str) {
switch (true) {
case /xyz/.test(str):
display("• Matched 'xyz' test");
break;
case /test/.test(str):
display("• Matched 'test' test");
break;
case /ing/.test(str):
display("• Matched 'ing' test");
break;
default:
display("• Didn't match any test");
break;
}
}
Działa to ze względu na sposób switch
działania instrukcji JavaScript , w szczególności dwa kluczowe aspekty: Po pierwsze, że przypadki są rozpatrywane w źródłowej kolejności tekstowej , a po drugie, że wyrażenia selektora (bity po słowie kluczowym case
) są wyrażeniami, które są oceniane tak, jak to jest oceniane (nie stałe jak w niektórych innych językach). Ponieważ nasze wyrażenie testowe jest true
, pierwszym case
wyrażeniem, które się true
pojawi, będzie to, które zostanie użyte.
switch(true) { case /foo/.test(bar): ....
true
, po prostu pomijasz wszystko razem.RegExp może być używany w ciągu wejściowym nie tylko technicznie, ale także praktycznie przy użyciu tej
match
metody.Ponieważ wynik
match()
jest tablicą, musimy pobrać pierwszy element tablicy wyniku. Gdy dopasowanie się nie powiedzie, funkcja powracanull
. Aby uniknąć błędu wyjątku, dodamy||
operator warunkowy przed uzyskaniem dostępu do pierwszego elementu tablicy i przetestujemy pod kąteminput
właściwości, która jest statyczną właściwością wyrażeń regularnych zawierających ciąg wejściowy.Innym podejściem jest użycie
String()
konstruktora do przekonwertowania wynikowej tablicy, która musi zawierać tylko 1 element (bez grup przechwytujących), a cały ciąg musi zostać przechwycony za pomocą kwantyfikatorów (.*
) na ciąg. W przypadku awariinull
obiekt stanie się"null"
łańcuchem. Niewygodny.W każdym razie bardziej eleganckim rozwiązaniem jest użycie metody
/^find-this-in/.test(str)
withswitch (true)
, która po prostu zwraca wartość logiczną i łatwiej jest wyszukiwać bez rozróżniania wielkości liter.źródło
Wystarczy użyć właściwości location.host
źródło
switch ("" + location.host)
.Inną opcją jest użycie
input
pola wyniku dopasowania wyrażenia regularnego :źródło
.length:
-> Jeśli dopasowanie zostanie wykonane, wyrażenie trójskładnikowe zwraca oryginalny token
----> Oryginalny token jest oceniany według wielkości liter
-> Jeśli dopasowanie nie zostanie wykonane, trójka zwraca wartość niezdefiniowaną
----> Case ocenia token względem niezdefiniowanej, która, mam nadzieję, nie jest twoja.
Test trójskładnikowy może być dowolny, na przykład w twoim przypadku
===========================================
jest wyrażeniem potrójnym.
Testem w tym przypadku jest token.match (/ spo /), który stwierdza dopasowanie łańcucha trzymanego w tokenie do wyrażenia regularnego / spo / (który w tym przypadku jest literalnym ciągiem spo).
Jeśli wyrażenie i ciąg znaków są zgodne, wynikiem jest prawda i zwraca token (ciąg, na którym działa instrukcja switch).
Oczywiście token === token, więc instrukcja switch jest dopasowana i wielkość liter jest oceniana
Łatwiej jest zrozumieć, jeśli spojrzysz na to warstwowo i zrozumiesz, że test tokarski jest oceniany „PRZED” instrukcją przełączania, tak aby instrukcja przełącznika widziała tylko wyniki testu.
źródło
token.match(/spo/)
to pasuje.To może być łatwiejsze. Spróbuj myśleć w ten sposób:
:
źródło
TypeError: url.match(...) is null
Może i będzie za późno, ale spodobało mi się to w przypadku zleceń :)
możesz wydłużyć to, przekazać listę opcji i obsłużyć wyrażenie regularne za pomocą |
źródło
|| {}
na|| [-1]
podobny typ bezpieczeństwa. Ponadto, dlaczego jestnew RegExp
używany, a nie tylko ukośniki?