Soy muy nuevo en la búsqueda de texto en una matriz, algunos elementos en la matriz están en los guardabosques, es decir, no puede ser nada después de cierto texto en este AA y A regex y tengo una matriz multidimensional y quiero buscar texto en cada matriz. Así que escribí algo como esto. Puse AA* en la matriz para que solo coincidieran los 2 primeros caracteres y A* para una sola coincidencia de caracteres.
arr = [ ["AA*","ABC","XYZ"] , ["A*","AXY","AAJ"] ] var text = "AA3"; for ($i=0; $i<arr.length; $i++ ){ var new_array = []; new_array = arr[$i]; new_array.filter(function(array_element) { var result = new RegExp(array_element).test(text); if( result == true){ console.log(arr[$i]); } }); }Entonces, lo que quiero es cuando el texto = "AA3" o cualquier cosa después del doble A AA [cualquier cosa] y la salida debe ser la primera matriz que es ["AA *", "ABC", "XYZ"] pero obtengo ambas matrices como salida y cuando el texto = "A3" , la salida debe ser la segunda matriz que es ["A *", "POI", "LKJ"] pero obtengo ambas matrices. Pero si el texto = "ABC" o el texto = "AAJ" entonces debería generar la primera matriz o la segunda matriz respectivamente. No sé nada sobre cómo escribir expresiones regulares o si hay alguna forma en que pueda implementar esto usando cualquier otro método. Gracias de antemano cualquier consejo será útil.
En resumen, ¡el problema es "*"! El * que se encuentra en los miembros de la matriz establecida es la razón por la que obtiene la misma matriz cada vez.
Regexp es un concepto que la mayoría de los desarrolladores encuentran difícil de entender (soy uno de esos por cierto 😅).
Comenzaré con un extracto de introducción a Regexp en MDN
Regexp son patrones usados para hacer coincidir combinaciones de caracteres en cadenas - MDN
Con eso en mente, desea comprender qué sucede con su código. Cuando crea un Regex como /A*/ para probar "AA3" , lo que coincidiría sería A , AA , etc. Esta es una verdad en javascript. Querría una coincidencia más estricta con ^ o $ o una coincidencia estricta de un número con \d .
Reescribí tu código como una función a continuación:
arr = [ ["AA*", "ABC", "XYZ"], ["A*", "AXY", "AAJ"], ]; findInArray(arr, "AA3") // prints both array findInArray(arr, "AAJ") // prints second array findInArray(arr, "ABC") // prints first array function findInArray(array, value) { return array.filter((subArray) => subArray.some((item) => { const check = new RegExp(value); return check.test(item); }) ); }El problema radica en el hecho de que usa cada una de las cadenas como una expresión regular.
* , esto se evalúa como cero o más coincidencias del elemento inmediatamente anterior, que siempre será true .true .Artículo de MDN sobre cuantificadores RegExp
Suposiciones:
* siempre está solo en la posición 0 ,text = 'AAJ' solo se devolverá la segunda matriz, pero tanto el AA* de la primera matriz como el AAJ de la segunda parecen coincidir con este text .Código:
const abc = (arrs, text) => { return arrs.filter(arr => { const regex = new RegExp(`^${arr[0].replace('*', '\\d+')}$`); return regex.test(text) || arr.includes(text); }) } const arr = [ ["AA*", "ABC", "XYZ"], ["A*", "AXY", "AAJ"] ]; console.log( `1=[${abc(arr, "AA3")}] 2=[${abc(arr, "ABC")}] 3=[${abc(arr, "AAJ")}]`);