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