a continuación hay una matriz de cadenas.
const arr = [ "list/1/item/1/", "item/2/", "item/3/subitem/2/", "item/4/subitem/3/someother/5", ]ahora tengo que filtrar las cadenas que tienen una cadena que comienza con el elemento/1/ y no es seguida por ninguna otra cadena o termina con la cadena elemento/1/
entonces la matriz filtrada esperada es como la siguiente,
const filtered_array = [ "list/1/item/1/", "item/2/", ]de esta matriz filtrada quiero obtener solo el número después del elemento/ por lo que el resultado esperado es
const ids = ["1","2"]he intentado a continuación
var output = arr.filter(x => x.match(/^item\/\d+|\bitem\/\d+\/$/)) .map(x => x.match(/(?<=^item\/)\d+|(?<=\bitem\/)\d+(?=\/$)/)[0]); //error //hereesto da salida como a continuación
const output = ["1", "2", "3", "4"]porque esto también coincide con las cadenas "elemento/3/elemento secundario/2/", "elemento/4/elemento secundario/3/algún otro/5",
¿Cómo puedo arreglar esta expresión regular para que coincida solo con las cadenas que comienzan con el elemento/3/ y no siguen ninguna otra cadena o terminan con el elemento/3/?
también obtengo que el objeto es posiblemente nulo en la línea de coincidencia del mapa. alguien podría ayudarme a arreglar esto. Gracias.
Parece que desea item/<any_number> , pero solo si es lo último en la cadena. Para hacerlo, usaría /\bitem\/\d+\/$/ :
\b significa "salto de palabra", por lo que no coincidimos con el subitemitem coincide con la palabra elemento literalmente\/ es cómo escribes un / dentro de una expresión regular para que coincida con un / literalmente\d significa "cualquier dígito"+ significa "uno o más (de esos dígitos)"\/ es otro literal /$ significa "fin de entrada Como desea obtener el número de eso, envolveríamos \d+ en () para convertirlo en un grupo de captura. Luego use map para crear un mapa de la cadena coincidente o undefined y luego filtre undefined con filter :
const rex = /\bitem\/(\d+)\/$/; const output = arr.map(str => (str.match(rex) ?? [])[1]) .filter(result => result !== undefined);Ejemplo en vivo:
const arr = [ "list/1/item/1/", "item/2/", "item/3/subitem/2/", "item/4/subitem/3/someother/5", ]; const rex = /\bitem\/(\d+)\/$/; const output = arr.map(str => (str.match(rex) ?? [])[1]) .filter(result => result !== undefined); console.log(output);O haga solo una pasada a través de los datos usando un ciclo simple:
const rex = /\bitem\/(\d+)\/$/; const output = []; for (const str of arr) { const match = str.match(rex); if (match) { output.push(match[1]); } }Ejemplo en vivo:
const arr = [ "list/1/item/1/", "item/2/", "item/3/subitem/2/", "item/4/subitem/3/someother/5", ]; const rex = /\bitem\/(\d+)\/$/; const output = []; for (const str of arr) { const match = str.match(rex); if (match) { output.push(match[1]); } } console.log(output); Sin embargo, tenga en cuenta que eso coincidiría con "sub-item/1/" . Si desea que el item esté al principio de la cadena o justo después de / , cambiamos \b a (?:^|\/) para decir "comienzo de cadena o / " (el (?:___) es solo para agrupar la alternancia [ | ]): /(?:^|\/)item\/(\d+)\/$/