这适用于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>
答案 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;
请注意,您在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
。