regex 如何获得这个数组的一个特定值(使用正则表达式)?

xqnpmsa8  于 2022-11-18  发布在  其他
关注(0)|答案(5)|浏览(155)

使用案例:

这是一个用JS编码的Cypress E2E测试,我正试图将一个正则表达式过滤器应用于此数组(超过100个值),以便能够忽略/flux/sitemaps/之前的所有内容,只捕获.xml文件名。我的目标是能够比较生产前和生产中的站点MapURL内容。
我想实现的一个例子是:

在正则表达式之前:

[
  "https://xxxxxxxxx.com/flux/sitemaps/sitemap_cms_1.xml",
  "https://xxxxxx.com/flux/sitemaps/sitemap_category_1.xml"
]

在正则表达式(测试目的)之后:

["/flux/sitemaps/sitemap_cms_1.xml", "/flux/sitemaps/sitemap_category_1.xml"]

或者

["sitemap_cms_1.xml","sitemap_category_1.xml"]

我已经尝试了不同的正则表达式规则,但迄今为止没有成功,任何帮助是非常感谢。

yr9zkbsy

yr9zkbsy1#

第一个匹配的正则表达式为/\/flux\/sitemaps\/.*/,第二个匹配的正则表达式为捕获组的/\/flux\/sitemaps\/(.*)/

const sitemap = [
  'https://xxxxxxxxx.com/flux/sitemaps/sitemap_cms_1.xml',
  'https://xxxxxx.com/flux/sitemaps/sitemap_category_1.xml'
]

const expected1 = [
  '/flux/sitemaps/sitemap_cms_1.xml',
  '/flux/sitemaps/sitemap_category_1.xml'
]

cy.wrap(sitemap)
  .then(sm => sm.map(url => url.match(/\/flux\/sitemaps\/.*/)[0]))
  .should('deep.eq', expected1)

const expected2 = [
  'sitemap_cms_1.xml',
  'sitemap_category_1.xml'
]

cy.wrap(sitemap)
  .then(sm => sm.map(url => url.match(/\/flux\/sitemaps\/(.*)/)[1]))
  .should('deep.eq', expected2)
c3frrgcw

c3frrgcw2#

最简单的方法是字符串替换。
如果你正在处理一个网站Map的原始部分将是一致的所有网址。

cy.wrap(sitemap)
  .then(sm => sm.map(url => url.replace('https://xxxxxx.com', '')))
  .should('deep.eq', [
    '/flux/sitemaps/sitemap_cms_1.xml',
    '/flux/sitemaps/sitemap_category_1.xml'
  ])
noj0wjuj

noj0wjuj3#

你可以使用Array.map创建一个新的数组,用另一个函数对已有数组的结果填充,在这个例子中,我们将使用Array.split删除/flux/sitemaps之前的所有内容,然后使用字符串插值将/flux/sitemaps添加回去。

const origArr = ["https://xxxxxxxxx.com/flux/sitemaps/sitemap_cms_1.xml","https://xxxxxx.com/flux/sitemaps/sitemap_category_1.xml"]

const newArr = origArr.map((x) => `/flux/sitemaps${x.split('/flux/sitemaps')[1]}`);
6rqinv9w

6rqinv9w4#

您可以使用数组Map和正则表达式从url中删除字符:

const source = [
  'https://xxxxxxxxx.com/flux/sitemaps/sitemap_cms_1.xml',
  'https://xxxxxx.com/flux/sitemaps/sitemap_category_1.xml'
];
const regex = /^.*?\/flux\/sitemaps\//;
let cleaned = source.map((url) => url.replace(regex, ''));
console.log(cleaned);

输出量:

[
  "sitemap_cms_1.xml",
  "sitemap_category_1.xml"
]

正则表达式说明:

  • ^-字符串的开头
  • .*?-非贪婪扫描,直到:
  • \/flux\/sitemaps\/-文字/flux/sitemaps/
qyswt5oh

qyswt5oh5#

使用Array#map()URL构造函数可以轻松地解析JavaScript中的URL,完全避免使用regex!
现在您可以轻松地比较它们之间的路径或再次Map以获取文件。

const urls = [
      "https://xxxxxxxxx.com/flux/sitemaps/sitemap_cms_1.xml",
      "https://xxxxxx.com/flux/sitemaps/sitemap_category_1.xml"
    ];

    const paths = urls.map(url => new URL(url).pathname);

    console.log(paths);
    
    const files = paths.map(path => {
      const parts = path.split('/');
      return parts[parts.length -1];
    });
    
    console.log(files);

在此之后,如果你想比较两个集合,你可以把其中一个变成一个集合,然后在另一个数组上做一个查找,看看哪一个不在第一个集合中。

相关问题