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".
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);
Je me rends compte que la question demande regex, mais la réponse sensée ici est
someArray.filter(str => str.includes('contact'))
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);
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.