用Java替换正则表达式匹配的第n个实例

时间:2020-03-05 18:45:30  来源:igfitidea点击:

我正在尝试编写一个正则表达式函数,该函数将识别和替换字符串中匹配项的单个实例,而不影响其他实例。例如,我有以下字符串:

12||34||56

我想用&符号替换第二组管道以获取此字符串:

12||34&&56

regex函数需要能够处理x数量的管道,并允许我替换第n组管道,因此我可以使用相同的函数进行以下替换:

23||45||45||56||67 -> 23&&45||45||56||67

23||34||98||87 -> 23||34||98&&87

我知道我可以在管道上拆分/替换/合并字符串,并且我也可以在/ \ | \ | //上进行匹配并遍历结果数组,但是我很想知道它是否可以编写一个可以做到这一点的表达式。注意,这将是针对Javascript的,因此可以在运行时使用eval()`生成正则表达式,但是不可能使用任何Perl特定的正则表达式指令。

解决方案

回答

这是可行的:

"23||45||45||56||67".replace(/^((?:[0-9]+\|\|){n})([0-9]+)\|\|/,"&&")

其中n是小于第n个管道的那个(当然,如果n = 0,则不需要该第一个子表达式)

如果我们想要一个函数来执行此操作:

function pipe_replace(str,n) {
   var RE = new RegExp("^((?:[0-9]+\|\|){" + (n-1) + "})([0-9]+)\|\|");
   return str.replace(RE,"&&");
}

回答

function pipe_replace(str,n) {
    m = 0;
    return str.replace(/\|\|/g, function (x) {
        //was n++ should have been m++
        m++;
        if (n==m) {
            return "&&";
        } else {
            return x;
        }
    });
}