web-dev-qa-db-ja.com

ES6はRegexで配列をフィルターします

一連のURLを含む配列をフィルタリングしようとしています。 「連絡先」という単語のみを含むURLを返す必要があります。

たとえば、リンク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))

    })

現在、「連絡先」という単語を含むドメインが1つあることがわかっている場合、すべてのドメインを通じてfalseが返されます。

11
Dileet

まず、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フラグを使用して、1つの正規表現を複数回使用することです。呼び出しごとに、次の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);_
20
Jaromanda X

質問は正規表現を要求していることを理解していますが、ここでの賢明な答えは

someArray.filter(str => str.includes('contact'))
4
John Haugeland

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

これを試して。うまくいくはずです。

1
Aditya Parmar