Estoy tratando de filtrar una matriz que contiene un montón de URL. Necesito devolver las URL que solo contienen la palabra "contacto".

Por ejemplo, hay un enlace https://www.example.com/v1/contact-us/ca

Esto debe ser devuelto desde el filtro.

Intenté esto:

    const regex = new RegExp("/\bcontact\b", 'g' )
    sites.links.filter((val) => {

     console.log(regex.test(val.href))

    })

Actualmente solo devuelve falso a través de todos los dominios, cuando sé que hay un dominio que contiene la palabra "contacto".

12
Dileet 30 oct. 2017 a las 08:00

4 respuestas

La mejor respuesta

En primer lugar, new RegExp('/\bcontact\b', 'g'); es equivalente a /\/@contact@/g donde @ son caracteres de retroceso (ASCII 08) ... claramente no es lo que quieres

Entonces, harías new RegExp('/\\bcontact\\b', 'g'); - esto es equivalente a /\/\bcontact\b/g

Sin embargo, el \\b después de / es redundante

Así que ... hasta /\/contact\b/g

Usar string.match aquí como regex.test se usa incorrectamente. Debajo está la descripción

var sites = { 
    links: [
        {href: 'https://www.example.com/v1/contact-us/ca'},
        {href: 'https://www.example.com/v1/contact-us/au'},
        {href: 'https://www.example.com/v1/contact-us/us'},
        {href: 'https://www.example.com/v1/dontcontact-us/us'}
    ]
};

const regex = new RegExp('/contact\\b', 'g');
const matchedSites = sites.links.filter(({href}) => href.match(regex));
console.log(matchedSites);

El siguiente problema es usar ONE regex varias veces en una bandera regexp.test con g. Con cada llamada, se verá desde la siguiente indexOf subcadena encontrada anterior y con llamadas consecutivas en una cadena del mismo tipo, básicamente devolverá true, false, true , false.

Si desea usar regex.test, no vuelva a usar la misma expresión regular a menos que sepa las consecuencias de hacerlo o no use la bandera g (que aquí no necesita)

var sites = { 
    links: [
        {href: 'https://www.example.com/v1/contact-us/ca'},
        {href: 'https://www.example.com/v1/contact-us/au'},
        {href: 'https://www.example.com/v1/contact-us/us'},
        {href: 'https://www.example.com/v1/dontcontact-us/us'}
    ]
};

const regex = new RegExp('/contact\\b', 'g');
const correctRegex = new RegExp('/contact\\b');

const matchedSitesFailed = sites.links.filter(({href}) => regex.test(href));
const matchedSitesSuccess = sites.links.filter(({href}) => new RegExp('/contact\\b', 'g').test(href));
const matchedSitesSuccess2 = sites.links.filter(({href}) => correctRegex.test(href));

console.log('failed returns:', matchedSitesFailed.length);
console.log('success returns:', matchedSitesSuccess.length);
console.log('success returns 2:', matchedSitesSuccess2.length);
21
Ashishkumar Singh 14 mar. 2019 a las 07:04

Me doy cuenta de que la pregunta requiere expresiones regulares, pero la respuesta sensata aquí es

someArray.filter(str => str.includes('contact'))
4
John Haugeland 10 ene. 2020 a las 21:05

Debe devolver el resultado verdadero / falso de la función filter.

const regex = new RegExp("/\b?contact\b?", 'g');

const sites = {
  links: [{
      href: 'http://www.some-site.com/contact-us'
    },
    {
      href: 'http://www.some-site.com/about'
    },
    {
      href: 'http://www.some-site.com/admin'
    }
  ]
}

const fitered = sites.links.filter((link) => {
  return link.href.match(regex);
});

console.log(fitered);
4
felixmosh 30 oct. 2017 a las 09:44
var links = ["https://www.example.com/v1/contact-us/ca", "https://www.example.com/v1/contact-us/sanjose", "https://www.example.com/v1/meeting-us/ca"];

var newlink = links.filter(function(link){
  return link.includes("contact")
});

console.log(newlink)

Prueba esto. Deberia de funcionar.

1
Aditya Parmar 30 oct. 2017 a las 05:27