替换字符没有括号括起来

时间:2017-03-15 12:26:23

标签: regex perl

我有一个包含大括号的字符串,我想用另一个字符B替换任何字符A,它不包含在一对开始和结束括号中。所以

  

ABCDACD {ACDA} ABCD

应替换为

  

BBCDBCD {ACDA} BBCD

如何使用正则表达式(例如在Perl中)执行此操作?括号不是嵌套的,但也适用于嵌套情况的解决方案会更好。

编辑:更改了字词

2 个答案:

答案 0 :(得分:2)

类似的question之前已经answered

Perl实现在替换评估部分会有所不同,但main idea是相同的:

使用交替捕获匹配来匹配不需要的上下文(即{.*?})或所需的子字符串(A)(按特定顺序)。然后根据匹配的部分替换不需要的捕获与自身和所需的捕获取代:

my $input = "ABCDACD{ACDA}ABCD";
$input =~ s/({.*?})|(A)/{$2 ? "B" : $1}/ge;

演示:https://ideone.com/bK4c1Y

答案 1 :(得分:1)

这是一个Perl解决方案,可以分步完成工作。首先,它将字符串拆分为支撑/非支撑项目的块。然后对未支撑的项目进行替换,最后再将项目重新组合在一起:

my $str = 'ABCDACD{ACDA}ABCD';
$str = do {
    my $i = 1; 
    join '', map {$i++ % 2 && $_ =~ s/A/B/g; $_ } split /(\{.*?\})/, $str 
};