对于那里的人来说可能很简单,但我想构建一个正则表达式来搜索这个字符串:
foo[0][2]
并返回
foo
0
2
在匹配数组中
到目前为止,我想出的是
([a-z]*)([(d)])/g
只回馈
0: "foo[0]"
1: "foo"
2: "[0]"
3: "0"
它不会重复到我的字符串中的下一个文字数组,因此不会击中[2]
部分。
我不是正则表达式忍者,希望得到一些帮助,以达到我需要的正确表达。
谢谢
我认为您正在寻找这种模式:([a-z]+)|([d])
console.log('foo[0][2]'.match(/([a-z]+)|([d])/g));
如果你不想要[]
部分,你可以试试这个:
console.log('foo[0][2]'.match(/([a-z]+)|(d)/g));
如果您使用模式([a-z]*)([(d)])
则可以使用 while 循环来获取第一个和第三个捕获组,但请注意,使用[a-z]*
匹配 0+ 次,例如也可以匹配[0][2]
中的部分。
const regex = /([a-z]*)([(d)])/g;
const str = `foo[0][2]`;
let m;
let result = [];
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
if (m[1] !== "") result.push(m[1]);
if (m[3] !== "") result.push(m[3]);
}
console.log(result);
如果要匹配该确切格式,可以使用 2 个捕获组首先匹配组 1 中的foo
,[0][2]
组 2 中的
b([a-z]+)((?:[d])+)
解释
b
单词边界(
捕获组 1[a-z]+
匹配 1+ 次 a 字符 a-z
)
关闭组(
捕获组 2(?:[d])+
重复 1+ 次匹配[]
之间的一位数字(使用d+
匹配 1 个或多个(
)
关闭组
正则表达式演示
如果该模式匹配,则可以从组 2 中获取所有数字,因为整体模式已经匹配。
const pattern = /b([a-z]+)((?:[d])+)/;
let parts = "foo[0][2]".match(pattern);
console.log([parts[1], ...parts[2].match(/d/g)]);