ES6使用Regex过滤数组

Dil*_*eet 9 javascript regex node.js

我正在尝试过滤包含一堆网址的数组.我需要返回仅包含"联系人"一词的网址.

例如,有一个链接 https://www.example.com/v1/contact-us/ca

这应该从过滤器返回.

我试过这个:

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

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

    })
Run Code Online (Sandbox Code Playgroud)

它当前只是通过所有域发回false,当我知道有一个域包含单词"contact"时.

Jar*_*a X 17

首先new RegExp('/\bcontact\b', 'g');是等同于/\/@contact@/g其中@的退格字符(ASCII 08)......显然不是你想要什么

所以,你会这样做new RegExp('/\\bcontact\\b', 'g');- 这相当于/\/\bcontact\b/g

但是,\\b后续/是多余的

所以...到... /\/contact\b/g

在这里使用string.match,因为误用了下面描述的regex.test

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);
Run Code Online (Sandbox Code Playgroud)

下一个问题是在a中多次使用ONE正则表达式 string.match

如果你想使用regex.test,那么除非你知道这样做的后果,否则不要重复使用相同的正则表达式

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);
Run Code Online (Sandbox Code Playgroud)


Joh*_*and 13

我意识到这个问题需要正则表达式,但这里的明智答案是

someArray.filter(str => str.includes('contact'))
Run Code Online (Sandbox Code Playgroud)

  • 您的意思是 include() 吗? (2认同)

fel*_*osh 5

您需要从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);
Run Code Online (Sandbox Code Playgroud)