ES6使用Regex过滤数组

时间:2017-10-30 05:00:40

标签: javascript node.js regex

我正在尝试过滤包含一堆网址的数组。我需要返回仅包含“contact”一词的网址。

例如,有一个链接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))

    })

当我知道有一个域包含“联系人”这个词时,它当前只是通过所有域发回false。

5 个答案:

答案 0 :(得分:14)

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

下一个问题是在regexp.test g标志中多次使用ONE正则表达式。对于每次调用,它将从下一个indexOf先前找到的子字符串开始查看,并且对同一类型字符串进行连续调用,它基本上将返回truefalsetruefalse

如果您想使用regex.test,请不要重复使用相同的正则表达式,除非您知道这样做的后果或不使用g标记(此处不是需要)



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




答案 1 :(得分:3)

您需要从Sub Count_Selection() Dim cell As Object Dim count As Integer count = 0 For Each cell In Selection count = count + 1 Next cell MsgBox count & " item(s) selected" End Sub 函数返回真值/错误结果。



filter




答案 2 :(得分:1)

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)

试试这个。它应该工作。

答案 3 :(得分:1)

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

someArray.filter(str => str.contains('contact'))

答案 4 :(得分:1)

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