包含正则表达式匹配中所有组的create数组的有效解决方案

时间:2015-01-09 17:10:36

标签: javascript regex

我正在寻找一种创建数组的有效方法,包含所有包含正则表达式组匹配的匹配。

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;
                }                    
            }                
        };
    }

3 个答案:

答案 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;]

你可以传入你想要的任何正则表达式字面值,它应该对数组中的每个项目起作用,如果匹配则返回它。如果您希望能够轻松地推断状态/可能必须稍后重新使用它以匹配不同的模式,我会选择这样的东西。这个问题对我来说有点模糊,所以你的确切需求可能略有不同 - 试图摆脱你预期的输入和输出。