No puede hacerlo de una manera a switch
menos que esté haciendo una coincidencia de cadena completa ; eso está haciendo coincidencia de subcadenas . (Esto no es del todo cierto, como señala Sean en los comentarios. Ver nota al final).
Si está contento de que su expresión regular en la parte superior esté eliminando todo lo que no desea comparar en su coincidencia, no necesita una coincidencia de subcadena y podría hacer:
switch (base_url_string) {
case "xxx.local":
// Blah
break;
case "xxx.dev.yyy.com":
// Blah
break;
}
... pero de nuevo, eso solo funciona si esa es la cadena completa con la que coinciden. base_url_string
Fallaría si fuera, por ejemplo, "aaa.xxx.local", mientras que su código actual coincidiría con el de la rama "xxx.local".
Actualización : Bueno, por lo que técnicamente se puede utilizar una switch
de subcadena coincidente, pero yo no lo recomendaría en la mayoría de las situaciones. Así es como ( ejemplo en vivo ):
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;
}
}
Eso funciona debido a la forma en switch
que funcionan las declaraciones de JavaScript , en particular dos aspectos clave: Primero, que los casos se consideran en orden de texto de origen , y segundo, que las expresiones del selector (los bits después de la palabra clave case
) son expresiones que se evalúan como ese caso es evaluado (no constantes como en algunos otros idiomas). Entonces, dado que nuestra expresión de prueba es true
, la primera case
expresión que resulte true
será la que se use.
switch(true) { case /foo/.test(bar): ....
true
allí, simplemente lo dejas todo junto.RegExp se puede usar en la cadena de entrada no solo técnicamente sino prácticamente con
match
método.Debido a que la salida de la
match()
es una matriz, necesitamos recuperar el primer elemento de la matriz del resultado. Cuando la coincidencia falla, la función regresanull
. Para evitar un error de excepción, agregaremos el||
operador condicional antes de acceder al primer elemento de matriz y probaremos con lainput
propiedad que es una propiedad estática de expresiones regulares que contiene la cadena de entrada.Otro enfoque es usar el
String()
constructor para convertir la matriz resultante que debe tener solo 1 elemento (sin grupos de captura) y la cadena completa debe capturarse con quanitifiers (.*
) en una cadena. En caso de falla, elnull
objeto se convertirá en una"null"
cadena. No conveniente.De todos modos, una solución más elegante es usar el
/^find-this-in/.test(str)
conswitch (true)
método que simplemente devuelve un valor booleano y es más fácil de buscar sin distinción entre mayúsculas y minúsculas.fuente
Solo usa la propiedad location.host
fuente
switch ("" + location.host)
.Otra opción es utilizar el
input
campo de un resultado de coincidencia regexp :fuente
.length:
-> Si se hace la coincidencia, la expresión ternaria devuelve el token original
----> El token original se evalúa por caso
-> Si la coincidencia no se realiza, el ternario devuelve indefinido
----> El caso evalúa el token contra indefinido, lo que esperamos que no sea tu token.
La prueba ternaria puede ser cualquier cosa, por ejemplo, en su caso
===========================================
es un expresión ternaria.
La prueba en este caso es token.match (/ spo /) que establece la coincidencia de la cadena contenida en el token con la expresión regular / spo / (que es la cadena literal spo en este caso).
Si la expresión y la cadena coinciden, da como resultado verdadero y devuelve el token (que es la cadena en la que opera la instrucción switch).
Obviamente token === token para que la declaración de cambio coincida y se evalúe el caso
Es más fácil de entender si lo mira en capas y comprende que la prueba de tornería se evalúa "ANTES" de la declaración de cambio para que la declaración de cambio solo vea los resultados de la prueba.
fuente
token.match(/spo/)
coincidiría.Puede ser mas facil. Intenta pensar así:
:
fuente
TypeError: url.match(...) is null
Podría ser demasiado tarde y todo, pero me gustó esto en caso de asignación :)
podría llevarlo más allá, pasar una lista de opciones y manejar la expresión regular con |
fuente
|| {}
a|| [-1]
o similar por tipo de seguridad. Además, ¿por qué senew RegExp
usa, no solo barras?