正则表达式从一个通用正则表达式获取多个捕获组

时间:2017-06-04 16:18:38

标签: javascript regex

这适用于JavaScript。

我的问题:

所以我想要一个可以为字符串获取多个子捕获组的正则表达式。现在我的尝试只获得一个,而我期望3.理想情况下,它应该是变化的,它应该能够得到2或3或更多。

我的尝试

let characters = {
  some: {
    test: {
      var: "hi"
    }
  }
}

let b = document.getElementById("body");
let h = b.innerHTML;
let regex = /(?:\$\{)([^.]*[.]?)*(?:\})/;
let match;
match = regex.exec(h);

console.log(match);
<div id="body">
  ${some.test.var}
</div>

我想要什么

let characters = {
      some: {
        test: {
          var: "hi"
        }
      }
    }

let b = document.getElementById("body");
let h = b.innerHTML;
let regex = /(?:\$\{)([^.]*)[.]([^.]*)[.]([^.]*)(?:\})/;
let match;
match = regex.exec(h);

console.log(match);
<div id="body">
  ${some.test.var}
</div>

1 个答案:

答案 0 :(得分:0)

您似乎希望使用单个捕获组在结果数组中获取多个组。使用JavaScript正则表达式是不可能的。见Repeating a Capturing Group vs. Capturing a Repeated Group。结果数组中将始终存在与模式中的捕获组一样多的组(+1,包含整个匹配的第0个组)。如果你使用(\w* )*它会匹配0+个字符然后一个空格并将它放入第1组缓冲区,然后,如果它找到另一个字符串和空格,正则表达式引擎将匹配此文本部分,替换组1内的内容,并继续搜索等。

您需要先匹配${...}子字符串(此处可能有多个选项,BTW,我建议/\${(\w+(?:\.\w+)*)}/g仅匹配有字词chars和${...}的{​​{1}} ,但它也可以是.),然后与/\${([^}]+)}/g分开:

&#13;
&#13;
.
&#13;
&#13;
&#13;

请注意,您在const regex = /\${(\w+(?:\.\w+)*)}/g; const str = `\${some.test.var} \${some.test.var.more.here}`; let m; while (m = regex.exec(str)) { console.log(m[1].split('.')); }中拥有整个匹配值。

模式详情

  • m[0] - \${文字子字符串
  • ${ - 第1组捕获:
    • (\w+(?:\.\w+)*) - 一个或多个单词字符
    • \w+ - 零个或多个序列:
      • (?:\.\w+)* - 一个点
      • \. - 一个或多个单词字符
  • \w+ - 文字}

如果您想简化模式,请使用}/\${([.\w]+)}/g