我正在尝试过滤一个包含一堆网址的数组。我需要返回只包含单词"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。
7条答案
按热度按时间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
是误用。以下是说明下一个问题是在
regexp.test
中多次使用ONE正则表达式,每次调用时,它将从下一个indexOf
查找上一个找到的子字符串,连续调用同一类型的字符串时,它基本上将返回true
,false
,true
,false
。如果你想使用
regex.test
,那么不要重复使用相同的正则表达式,除非你知道这样做的后果,或者不要使用g
标志(这里你不需要)7gs2gvoe2#
您需要返回
filter
函数的真/假结果。ax6ht2ek3#
试试这个应该管用。
xeufq47z4#
iyzzxitl5#
我的看法。操作员要求正则表达式。
test返回falsy,因此你可以直接在过滤器中使用它作为返回值。
xxb16uws6#
我能想到的最好答案是:
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语法:
2hh7jdfx7#
这是一个迟来的回答,但为了简单起见,绑定是您的朋友。
工作原理:filter返回回调返回“真实”结果的所有元素。RegExp.exec返回null或结果集。null为falsey,因此任何返回null的回调都将被过滤掉。