【问题标题】:Regular expression to match number in the middle正则表达式匹配中间的数字
【发布时间】:2014-12-31 22:48:56
【问题描述】:

以下字符串表示一个视图模型属性,在这种情况下它有 3 个不同的索引:

PROGRAMA_FASES[1].PROGRAMA_FASE_REPLICAS[0].PROGRAMA_FASES.PROGRAMA_PREGUNTAS[2].Value

我正在使用这些函数来增加第一个索引或最后一个索引。

function increment_last(v) {
    return v.replace(/[0-9]+(?!.*[0-9])/, function (match) {
        return parseInt(match, 10) + 1;
    });
}

function increment_first(v) {
    return v.replace(/(\d+)/, function (match) {
        return parseInt(match, 10) + 1;
    });
}

...如您所见,我正在使用正则表达式来匹配数字,然后再增加它。

你能帮我用一个只匹配中间索引的正则表达式吗?在这种情况下,它将是“0”。

非常感谢

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    如果模式一致 (TEXT[NUMBER].TEXT[NUMBER].TEXT[NUMBER]),您可以匹配所有匹配项,然后选择第二个匹配项。一个简单的例子(假设上面的 TEXT 总是字符串字符并且从不包含数字)是:

    var number = "PATTERN[0].TO[1].MATCH[2]".match(/\d/g)[1];
    

    如果您希望将数字混合在一起并且只想匹配括号中的数字,您可以更新正则表达式,如/\[\d\]/g,然后从匹配的括号中选择数字。

    【讨论】:

      【解决方案2】:

      以下正则表达式将捕获所有三个值。

      .*\[(\d*)*\].*\[(\d*)*\].*\[(\d*)*\].*
      

      您可以在以下示例中访问它们

      var myString = "PROGRAMA_FASES[1].PROGRAMA_FASE_REPLICAS[0].PROGRAMA_FASES.PROGRAMA_PREGUNTAS[2].Value";
      var myRegexp = /.*\[(\d*)*\].*\[(\d*)*\].*\[(\d*)*\].*/g;
      var match = myRegexp.exec(myString);
      console.log(match[1]); // Will output 1
      

      【讨论】:

        【解决方案3】:

        感谢你们的回答,这给了我更好的方法和另一种思考解决方案的方式。

        最后我找到了这个答案https://stackoverflow.com/a/7958627/1532797,它为这个问题提供了一个很好的解决方案,并且可以用于许多其他目的。

        在我的情况下,我可以像这样简单地增加所需的索引位置调用函数:

        function increment_index(v, i) {
            return replaceNthMatch(v, /(\d+)/, i, function (val) {
                return parseInt(val, 10) + 1;
            });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-23
          • 2014-09-27
          • 2016-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多