我正在寻找一种创建数组的有效方法,包含所有包含正则表达式组匹配的匹配。
e.g。正则表达式/(1)(2)(3)/g
字符串123
预期结果['1','2','3']
我目前的代码如下:
var matches = [];
value.replace(fPattern, function (a, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15) {
for(var i = 1, v; i < 15; i++){
v = eval('s' + i);
if(v){
matches.push(v);
}else{
break;
}
}
});
它有效,但我不喜欢它的方式。
首先,我实际上不知道在我的正则表达式变量fPattern
中我将拥有多少组,所以我需要定义很多不必要的变量s1, s2 ... etc
。
第二个问题是我决定使用邪恶的eval
来防止将这些变量“手动”逐个推送到阵列,也许有更好的解决方案?
还有一件事 - 我确实尝试过使用match()
但不幸的是,当我有模式/(1)(2)(3)/g
时,它会返回数组['123']
,所以这不是我想要实现的目标。
谢谢!
修改
好的,我找到了一些看起来更好的东西
matches = fPattern.exec(value);
if(matches && matches.length){
for(var key in matches){
if(key !== '0'){
if(key !== 'index'){
formated += matches[key] + ' ';
}else{
break;
}
}
};
}
答案 0 :(得分:1)
像
这样的东西arrays = "123".match(/(1)(2)(3)/);
arrays.splice(0,1);
console.log(arrays);
=> Array [ "1", "2", "3" ]
match
返回一个数组,其中数组索引0
将包含整个匹配。从数组索引1
开始,它将包含相应捕获组的值。
arrays.splice(0,1);
会从数组中删除索引0
元素,整个匹配,结果数组只包含teh捕获组值
答案 1 :(得分:1)
使用RegExp.exec
并收集其返回值,包括主匹配,捕获组和主匹配的起始索引。
function findall(re, input) {
// Match only once for non global regex
// You are free to modify the code to turn on the global flag
// and turn it off before return
if (!re.global) {
return input.match(re);
} else {
re.lastIndex = 0;
}
var arr;
var out = [];
while ((arr = re.exec(input)) != null) {
delete arr.input; // Don't need this
out.push(arr);
// Empty string match. Need to advance lastIndex
if (arr[0].length == 0) {
re.lastIndex++;
}
}
return out;
}
答案 2 :(得分:1)
一个不太有状态/功能更强的解决方案可能是这样的:
function findInString(string, pattern) {
return string.split('').filter(function (element) {
return element.match(pattern)
})
}
接受字符串搜索和正则表达式文字,返回匹配元素的数组。所以,例如:
var foo = '123asfasff111f6';
findInString(foo, /\d/g)
将返回[ '1', '2', '3', '1', '1', '1', '6' ]
,其中似乎是您正在寻找的内容(?)。(至少,基于以下内容)
e.g。正则表达式/(1)(2)(3)/ g string 123预期结果[&#39; 1&#39;,&#39; 2&#39;,&#39; 3&#39;]
你可以传入你想要的任何正则表达式字面值,它应该对数组中的每个项目起作用,如果匹配则返回它。如果您希望能够轻松地推断状态/可能必须稍后重新使用它以匹配不同的模式,我会选择这样的东西。这个问题对我来说有点模糊,所以你的确切需求可能略有不同 - 试图摆脱你预期的输入和输出。