【问题标题】:How to match particular strings in an array using javascript?如何使用javascript匹配数组中的特定字符串?
【发布时间】:2022-02-04 19:35:58
【问题描述】:

我有一个字符串数组,如下所示,

const arr = [
    "list-domain/1/",
    "list-domain/1/list/1",
    "some-group/2/",
    "some-group/2/list/2",
    "list/3/",
    "list/3/item/1"
];

从上面的数组中可以看出,我想检查数组是否包含某种字符串

"list-domain/1/" or "some-group/2/" or "list/3/"

这里 / 之后的数字可以是任何数字。在“list-domain/1”中的含义这里 1 可以是 2 或 3 任何数字我必须检查字符串是否包含 list-domain 或 some-group 或 list 后跟 / 以及任何数字后跟 /

所以对于上述数组,预期的输出为真。

现在考虑下面的数组,

const arr1 = [
    "list-domain/1/list/1",
    "some-group/2/list/2",
    "list/3/item/1"
];

对于 arr1,预期的输出为假,尽管有字符串 list-domain/1、some-group/2 和 list/3,但它们后面也跟着一些其他字符串,例如 list-domain/1/list/1、some- group/2/list/2, list/3/item/1

所以我想找到确切的字符串数字可以是 / 之后的任何内容。有人可以帮助我如何做到这一点。谢谢。

编辑:

如果字符串有“list/1/”或

,我希望它返回true

任何后跟“list/1”的字符串,但如果“list/1”后跟类似下面的其他字符串,则返回false

 "list-domain/1/list/1/item/1"

以下情况为真

"list-domain/1/list/1"
"list/2"
"some-group/3/list/3"

【问题讨论】:

  • " 我想检查数组是否包含“list-domain/1/”或“some-group/2/”或“list/3/”类型的字符串我>。你想匹配确切的字符串"list-domain/1/" 还是输入类似于["list-domain", "some-group", "list"]
  • 是的,我想匹配确切的字符串。没有输入不会像你提到的那样。它后面会跟着 / 和一些数字和 / 所以字符串就像 list-domain/1/ 或 some-group/1/ 或 list/2/。我对这些字符串很感兴趣
  • 如果字符串“list/2/”之前有其他字符串,我也想返回true。所以它也应该为这些字符串返回 true "some-group/2/list/2/" , "list-domain/4/list/3/", "list/2/"

标签: javascript


【解决方案1】:

这使用正则表达式 (RegExp) 为您提供所需的输出:

arr.some(a=> new RegExp(/^(list-domain|some-group|list)\/[0-9]+\/$/g).test(a))

【讨论】:

  • 除此之外,我如何还能匹配包含 "some-group/2/list/2/" 或 "list-domain/4/list/2/" 之类的字符串。所以基本上 list/2/ 但在这个字符串之前也可以是任何东西。我怎样才能将该正则表达式添加到上面?
  • 您可以删除map并使其成为:arr.some(a => new RegExp(...).test(a))
  • @stackuser,根据需要升级您的正则表达式:arr.map(a=> new RegExp(/^(list-domain|some-group|list)\/[0-9]+(\/list\/[0-9]+)?\/$/g).test(a))
  • 我不想为字符串“list-domain/2/”、“some-group/3/”返回true,所以我已经重写了正则表达式,arr.map(a=> new RegExp(/^(+\/item\/[0-9]+\/$/g).test(a)).some(value => value === true); 但这会产生错误,我认为我写错了正则表达式。
  • arr1.some(a=> new RegExp(/\/item\/[0-9]+\/$/g).test(a)); 这可能是你想要的。
【解决方案2】:

如果您可以指望模式的形状始终是一个字符串标识符后跟一个数字 id,那么解析器可能如下所示:

const arr = [
    "list-domain/1/",
    "list-domain/1/list/1",
    "some-group/2/",
    "some-group/2/list/2",
    "list/3/",
    "list/3/item/1"
];

const parse = (str) => {
    const parts = str.split('/');
    return parts.reduce((parsed, part, i, parts) => {
        if (part === '') return parsed;
        if (i % 2 === 0) {
            parsed[part] = null;
        } else {
            parsed[parts[i-1]] = part;
        }
        return parsed;
    }, {});
}

arr.forEach(s => {
    console.log(parse(s));
})

// returns:
// {list-domain: "1"}
// {list-domain: "1", list: "1"}
// {some-group: "2"}
// {some-group: "2", list: "2"}
// {list: "3"}
// {list: "3", item: "1"}

它返回一个对象,其中键是字符串标识符,值是数字 ID。但是,正如我所说,它依赖于字符串的确切形状以及标识符和值的定期更改。

【讨论】:

    【解决方案3】:

    使用正则表达式。这是一个例子。

    const rx = /^(([^\/]+)\/(\d+)\/)+$/
    // or without the groups
    const rxNoGroups = /^([^\/]+\/\d+\/)+$/
    
    const found = items.filter(it => rx.test(it))
    

    这个正则表达式测试

    • 输入开始
    • 不是斜线
    • 斜线
    • 号码
    • 斜线
    • 输入结束或下一组

    根据您的需求量身定制。我对其进行了编码,因此您的非数字单词仍然可以包含数字,所以foo/2/bar3/4/。您还可以限制重复次数。

    你也可以只测试字符串是否以/结尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多