用正则表达式替换字符序列

时间:2009-12-28 19:21:56

标签: regex

如果我有字符串:ababa

我想用“c”替换任何“aba”序列。我该怎么做呢?被“c”替换的正则表达式“aba”不起作用,因为它出现为“cba”。我想把它作为“cc”出来。我猜这是因为第一场比赛正在消耗输入字符串中的第二个“a”。知道怎么做吗?

6 个答案:

答案 0 :(得分:2)

一次通过!

s/ab(?=aba)|aba/c/g;

这实际上是 解决方案!

aba -> cc
ababa -> ccc
abazaba -> czc

答案 1 :(得分:0)

“c”是否出现在原始字符串中?

如果没有,请使用循环重复替换字符串。将“aba”替换为“c”,并将“cba”替换为“cc”。

编辑:如果c确实出现,是否有一些字符没有出现在原始字符串中?说,z?

使用循环将“aba”替换为“z”,并将“zba”替换为“zz”。循环结束后,将所有“z”替换为“c”。

答案 2 :(得分:0)

AB(?=一) 零宽度正向前瞻断言。

答案 3 :(得分:0)

我不确定你是否可以在单通道正则表达式替换中执行此操作 - 大多数正则表达式引擎将替换视为必须处理模式的非重叠匹配。

相反,您可能希望编写一些简单的代码来扫描字符串并查找重叠事件,然后使用适当的重复次数替换事件的运行,然后再继续下一次运行。

答案 4 :(得分:0)

我认为只需一步就可以实现,因为第一场比赛将使第二场比赛失效。你可以使用两个步骤来实现它,看看你在做什么工具?

首先匹配被a的

包围的b
s/(?<=a)~b~(?=a)/b/g

这匹配b并替换它们,然后你可以使用另一个步骤去除周围的一个

s/(~a~|a~|~a)//g

这是一个使用perl like语法的例子,我插入的〜字符只是为了标记应该在第二步中删除的a。

答案 5 :(得分:0)

它必须是多次传递,如:

s/ab(?=a)/c/g followed by s/a//g

你也可以在perl中使用pos match函数来重置你最后一场比赛的位置(也就是你会做pos = pos -1这样的事情)。如果您想沿着这条道路前进,Mastering Perl是一个很好的参考。