【问题标题】:How to get matched index of a regex for all occurences如何获取所有出现的正则表达式的匹配索引
【发布时间】:2020-09-14 08:22:49
【问题描述】:

我有一个字符串

CO12dadaCO2dafdCO345daaf

我想提取所有出现的 CO,后跟一些数字 /CO(\d*)([\s\S]*)/,直到另一个 CO。

在这种情况下,我想得到输出:

['CO12dada', 'CO2dafd', 'CO345daaf']

我尝试的上述正则表达式也同时匹配了 CO 的其余部分,因此它不起作用。

我可以使用str.search 获取第一个匹配项的正则表达式索引,但我需要所有匹配项的正则表达式索引。

【问题讨论】:

  • 喜欢这个? CO[a-z0-9]+regex101.com/r/etgIMq/1
  • 我需要匹配后面的任何东西,除了另一个匹配。
  • 使用非贪婪量词和正向前瞻 CO[\s\S]*?(?=CO|$) regex101.com/r/VRskly/1
  • 使用Javascript,你也可以将其缩短为CO[^]*?(?=CO|$)

标签: javascript regex


【解决方案1】:

const string = 'CO12dadaCO2dafdCO345daaf'
const result = string.match(/(CO.*?)(?=CO|$)/g)
console.log(result)

【讨论】:

  • 我接受了这个答案,因为您提到了解决问题的全局选项。
【解决方案2】:

只需与.split() 匹配即可:

console.log("CO12dadaCO2dafdCO345daaf".split(/(?!^)(?=CO)/))

结果:

[
  "CO12dada",
  "CO2dafd",
  "CO345daaf"
]

(?!^)(?=CO) = 匹配CO 子字符串之前的空字符串,但不匹配字符串开头。

【讨论】:

  • 酷我不知道 split 像这样使用正则表达式。这是一个积极的前瞻, (?!^) 做什么?
  • @eguneys (?!^) 是负前瞻,请参阅this question about it
  • 所以 split 相当于带有全局正则表达式的match
  • 这很令人困惑,因为正则表达式与输入不匹配,而是以某种方式制作标记(这是什么意思),并且在拆分的情况下,这些标记被拆分。你能澄清你的答案吗?
  • @eguneys 这超出了范围,但您可能希望匹配字符串中的空位置以在其中插入内容。 "a1b2".replace(/(?=\d)/g, '-') 返回a-1b-2。您必须阅读的是"Lookahead and Lookbehind Zero-Length Assertions"。另请参阅Mastering Lookahead and Lookbehind
【解决方案3】:

或者这个:

CO\w+?(?=CO|$)

在此处查看演示:https://regex101.com/r/gFZomh/1

基本上:“CO”之后的所有“单词字符”的“非贪婪”匹配,然后是要求另一个“CO”或字符串结尾的前瞻。

如果你还想匹配“非单词字符”,你可以修改正则表达式为

CO[\w\W]+?(?=CO|$)

这也适用于 "CO12dadaCO2da,fdCO345daaf" 之类的东西来生成匹配项:["CO12dada","CO2da,fd","CO345daaf"]

【讨论】:

    【解决方案4】:

    使用Javascript,可以使用

    CO[^]*?(?=CO|$)
    
    • CO[^]*? 匹配 CO,然后尽可能少地匹配任何字符,包括换行符
    • (?=CO|$) 正向前瞻,断言右边是 CO 或字符串的结尾

    REgex demo

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      相关资源
      最近更新 更多