javascript ES6使用Regex过滤数组

sirbozc5  于 2023-01-01  发布在  Java
关注(0)|答案(7)|浏览(160)

我正在尝试过滤一个包含一堆网址的数组。我需要返回只包含单词"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。

ljsrvy3e

ljsrvy3e1#

首先,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中多次使用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);
7gs2gvoe

7gs2gvoe2#

您需要返回filter函数的真/假结果。

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.split('/').some((part) => part.includes('contact'));
});

console.log(fitered);
ax6ht2ek

ax6ht2ek3#

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)

试试这个应该管用。

xeufq47z

xeufq47z4#

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

iyzzxitl5#

我的看法。操作员要求正则表达式。

const domains = [{href: 'https://foo'}, {href: 'https:://bar'}, {href: 'https:://bar/contact'}]
  const match = domain => {
    return RegExp('/contact\\b', 'g').test(domain.name)
  }
 const needle = domains.filter(domain.href => match(domain))

test返回falsy,因此你可以直接在过滤器中使用它作为返回值。

xxb16uws

xxb16uws6#

我能想到的最好答案是:

const sites = {
    links: {
        'http://www.some-site.com/contact-us',
        'http://www.some-site.com/about',
        'http://www.some-site.com/admin'
    }
};
sites.links.forEach(i => {
    console.log(i.search(/\/\bcontact\b/g) > -1);
});

sites.links.forEach()遍历所有可用链路
i => {/*...*/}用于function(i) {/*...*/}的ES6语法
console.log()记录结果
/\/\bcontact\b/g的工作原理与new RegExp("/\bcontact\b", "g")i.search(regexp) > -1相同,"string".search("s")表示,它将搜索"string"中的字母"s"并返回其在字符串中的索引,如果在string中未"找到""s",则返回-1,因此我们将检查"string"中是否存在"s"并返回true/false值
代码的ES5语法:

sites.links.forEach(function(i) {
    console.log(i.search(/\/\bcontact\b/g) > -1);
});
2hh7jdfx

2hh7jdfx7#

这是一个迟来的回答,但为了简单起见,绑定是您的朋友。

let re = /dog/g;
let fn = re.exec.bind(re);
let strings = ['things','a dog is here','fruity ideas'];

let filtered = strings.filter(fn);

console.log({
  strings,
  filtered
})

工作原理:filter返回回调返回“真实”结果的所有元素。RegExp.exec返回null或结果集。null为falsey,因此任何返回null的回调都将被过滤掉。

相关问题