【问题标题】:Is it possible to get multiple of the same capture group? [duplicate]是否有可能获得多个相同的捕获组? [复制]
【发布时间】:2021-03-19 07:23:40
【问题描述】:

我有 bright orange bags contain 5 faded olive bags, 5 posh tomato bags, 1 plain green bag. 这样的字符串

我想提取收纳袋的颜色,以及收纳袋的数量和颜色。所以我的理想输出应该包含['bright orange', '5', 'faded olive', '5', 'posh tomato', '1', 'plain green']

我尝试了以下正则表达式,但没有给我想要的:

/^(\w+ \w+) bags contain (?:(\d+) (\w+ \w+) bag(?:s.|.|s, |, ))+$/

这让我很感动

["bright orange bags contain 5 faded olive bags, 5 posh tomato bags, 1 plain green bag.", "bright orange", "1", "plain green"]

容器颜色和最后包含的数量和颜色是什么。

如果我将 + 更改为特定数字,例如{2},然后我得到与匹配数量正好匹配的字符串的正确输出,但我不想做 n 正则表达式,其中 n 是最大匹配数,{1,n} 给出与+ 相同的结果.

我查看了this question,但它的答案指定了一个数字。

每次组匹配时是否有正则表达式输出?

(我指定了 JavaScript,因为我知道在某些情况下它的正则表达式会有所不同)

【问题讨论】:

  • 类似[...s.matchAll(/(\d+) (\w+) (\w+) bags?/g)]?单独抢bags contain?如果您想要多个匹配或更精确,我会使用多次传递:第一次获取“数字...袋子”块,甚至是您需要的子字符串,然后用第二个正则表达式切割每个块。捕获组将始终保持最后一场比赛。这在很大程度上取决于您的实际用例,这似乎很难根据这里的一句话来确定——似乎有很多变体。
  • 这些答案之一是否解决了您的问题?如果没有,您能否提供更多信息来帮助回答?
  • @Nick 没有。副本指出做不到。

标签: javascript regex


【解决方案1】:

您可以使用正则表达式匹配包描述之前的可选数字,并循环匹配以形成您的输出数组:

const str = 'bright orange bags contain 5 faded olive bags, 5 posh tomato bags, 1 plain green bag.';

const regex = /(?:(\d+)\s+)?(\w+\s+\w+)\s+bags?/g;

let result = [];
while ((arr = regex.exec(str)) !== null) {
  if (arr[1] !== undefined) result.push(arr[1]);
  result.push(arr[2]);
}
console.log(result);

【讨论】:

    【解决方案2】:

    我不确定这是否适用于您的所有场景,但这是我想出的:

    function itemize(string){
      const s = string.split(/\s*(?:,|contain)\s*/);
      for(let i=0,m,v,l=s.length; i<l; i++){
        v = s[i]; m = v.match(/^[0-9]+/); s[i] = v.replace(/^\s*[0-9]+\s*|\s+bag(\.|s)\s*$/g, '');
        if(m){
          s.splice(i++, 0, m[0]); l++;
        }
      }
      return s;
    }
    let testString = 'bright orange bags contain 5 faded olive bags, 5 posh tomato bags, 1 plain green bag.'
    const res = itemize(testString);
    console.log(res);

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2021-10-30
      • 2021-05-10
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      相关资源
      最近更新 更多