web-dev-qa-db-fra.com

ES6 filtre un tableau avec Regex

J'essaie de filtrer un tableau qui contient un tas d'URL. Je dois renvoyer les URL qui ne contiennent que le mot "contact".

Par exemple, il existe un lien https://www.example.com/v1/contact-us/ca

Cela devrait être renvoyé par le filtre.

J'ai essayé ceci:

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

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

    })

Il renvoie actuellement faux à travers tous les domaines, quand je sais qu'il y a un domaine qui contient le mot "contact".

11
Dileet

Tout d'abord, new RegExp('/\bcontact\b', 'g'); est équivalent à /\/@contact@/g Où les @ Sont des caractères de retour arrière (ASCII 08) ... clairement pas ce que vous voulez

Donc, vous feriez new RegExp('/\\bcontact\\b', 'g'); - cela équivaut à /\/\bcontact\b/g

Cependant, \\b Après / Est redondant

alors ... jusqu'à /\/contact\b/g

Utiliser string.match Ici car regex.test Est mal utilisé. Ci-dessous la description

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);

Le problème suivant consiste à utiliser l'ONE regex plusieurs fois dans un regexp.test Avec l'indicateur g. Avec chaque appel, il recherchera à partir de la sous-chaîne trouvée suivante indexOf précédente et avec des appels consécutifs sur une chaîne de même type, il renverra essentiellement true, false, true, false.

Si vous voulez utiliser regex.test, Alors ne réutilisez pas la même expression régulière à moins que vous ne connaissiez les conséquences de le faire ou n'utilisez pas l'indicateur g (dont vous n'avez pas besoin ici)

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);
20
Jaromanda X

Je me rends compte que la question demande regex, mais la réponse sensée ici est

someArray.filter(str => str.includes('contact'))
4
John Haugeland

Vous devez renvoyer le résultat véridique/falsifié de la fonction 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
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)

Essaye ça. Ça devrait marcher.

1
Aditya Parmar