operadores - Comparación de cadenas comodín en Javascript
operadores logicos javascript (5)
digamos que tengo una serie con muchas cadenas llamadas "birdBlue", "birdRed" y algunos otros animales como "pig1", "pig2).
Ahora ejecuto un bucle for que atraviesa la matriz y debería devolver todas las aves. ¿Qué comparación tendría sentido aquí?
Animals == "bird*"
fue mi primera idea pero no funciona. ¿Hay una manera de usar el operador * (o hay algo similar a usar?
Creo que quiso decir algo como "*" (estrella) como comodín, por ejemplo:
- "a * b" => todo lo que comienza con "a" y termina con "b"
- "a *" => todo lo que comienza con "a"
- "* b" => todo lo que termina con "b"
- "* a *" => todo lo que tiene una "a" en ella
- "* a * b *" => todo lo que tiene una "a", seguido de cualquier cosa, seguido de una "b", seguido de cualquier cosa
o en tu ejemplo: "bird *" => todo lo que comienza con bird
Tuve un problema similar y escribí una función con RegExp:
//Short code
function matchRuleShort(str, rule) {
return new RegExp("^" + rule.split("*").join(".*") + "$").test(str);
}
//Explanation code
function matchRuleExpl(str, rule) {
// "." => Find a single character, except newline or line terminator
// ".*" => Matches any string that contains zero or more characters
rule = rule.split("*").join(".*");
// "^" => Matches any string with the following at the beginning of it
// "$" => Matches any string with that in front at the end of it
rule = "^" + rule + "$"
//Create a regular expression object for matching string
var regex = new RegExp(rule);
//Returns true if it finds a match, otherwise it returns false
return regex.test(str);
}
//Examples
alert(
"1. " + matchRuleShort("bird123", "bird*") + "/n" +
"2. " + matchRuleShort("123bird", "*bird") + "/n" +
"3. " + matchRuleShort("123bird123", "*bird*") + "/n" +
"4. " + matchRuleShort("bird123bird", "bird*bird") + "/n" +
"5. " + matchRuleShort("123bird123bird123", "*bird*bird*") + "/n"
);
Si quieres leer más sobre las funciones utilizadas:
Debe usar RegExp (son impresionantes) una solución fácil es:
if( /^bird/.test(animals[i]) ){
// a bird :D
}
Podrías usar el método de substring de Javascript. Por ejemplo:
var searchArray = function(arr, str){
// If there are no items in the array, return an empty array
if(typeof arr === ''undefined'' || arr.length === 0) return [];
// If the string is empty return all items in the array
if(typeof str === ''undefined'' || str.length === 0) return arr;
// Create a new array to hold the results.
var res = [];
// Check where the start (*) is in the string
var starIndex = str.indexOf(''*'');
// If the star is the first character...
if(starIndex === 0) {
// Get the string without the star.
str = str.substr(1);
for(var i = 0; i < arr.length; i++) {
// Check if each item contains an indexOf function, if it doesn''t it''s not a (standard) string.
// It doesn''t necessarily mean it IS a string either.
if(!arr[i].indexOf) continue;
// Check if the string is at the end of each item.
if(arr[i].indexOf(str) === arr[i].length - str.length) {
// If it is, add the item to the results.
res.push(arr[i]);
}
}
}
// Otherwise, if the star is the last character
else if(starIndex === str.length - 1) {
// Get the string without the star.
str = str.substr(0, str.length - 1);
for(var i = 0; i < arr.length; i++){
// Check indexOf function
if(!arr[i].indexOf) continue;
// Check if the string is at the beginning of each item
if(arr[i].indexOf(str) === 0) {
// If it is, add the item to the results.
res.push(arr[i]);
}
}
}
// In any other case...
else {
for(var i = 0; i < arr.length; i++){
// Check indexOf function
if(!arr[i].indexOf) continue;
// Check if the string is anywhere in each item
if(arr[i].indexOf(str) !== -1) {
// If it is, add the item to the results
res.push(arr[i]);
}
}
}
// Return the results as a new array.
return res;
}
var birds = [''bird1'',''somebird'',''bird5'',''bird-big'',''abird-song''];
var res = searchArray(birds, ''bird*'');
// Results: bird1, bird5, bird-big
var res = searchArray(birds, ''*bird'');
// Results: somebird
var res = searchArray(birds, ''bird'');
// Results: bird1, somebird, bird5, bird-big, abird-song
Qué salidas:
var list = ["bird1", "bird2", "pig1"]
for (var i = 0; i < list.length; i++) {
if (list[i].substring(0,4) == "bird") {
console.log(list[i]);
}
}
Básicamente, estás revisando cada elemento de la matriz para ver si las primeras cuatro letras son ''pájaro''. Esto asume que ''pájaro'' siempre estará al frente de la cuerda.
Así que digamos que obtienes un nombre de ruta desde una URL:
Digamos que estás en bird1? = Letsfly - podrías usar este código para verificar la URL:
bird1
bird2
Lo anterior coincidiría con el primero de los URL, pero no el tercero (no el cerdo). Puede cambiar fácilmente url.substring(0,4)
con una expresión regular, o incluso otro método javascript como .contains ()
Usar el método .contains()
puede ser un poco más seguro. No necesitarás saber en qué parte de la URL "pájaro" se encuentra. Por ejemplo:
var listOfUrls = [
"bird1?=letsfly",
"bird",
"pigs?=dontfly",
]
for (var i = 0; i < list.length; i++) {
if (listOfUrls[i].substring(0,4) === ''bird'') {
// do something
}
}
if(mas[i].indexOf("bird") == 0)
//there is bird
Puede leer acerca de indexOf aquí: http://www.w3schools.com/jsref/jsref_indexof.asp
var url = ''www.example.com/bird?=fly''
if (url.contains(''bird'')) {
// this is true
// do something
}
Hay una larga lista de advertencias a un método como este, y una larga lista de "qué pasaría si" no se tienen en cuenta, algunas de las cuales se mencionan en otras respuestas. Pero para un uso simple de la sintaxis en estrella este puede ser un buen punto de partida.