我有一个包含大括号的字符串,我想用另一个字符B替换任何字符A,它不包含在一对开始和结束括号中。所以
ABCDACD {ACDA} ABCD
应替换为
BBCDBCD {ACDA} BBCD
如何使用正则表达式(例如在Perl中)执行此操作?括号不是嵌套的,但也适用于嵌套情况的解决方案会更好。
编辑:更改了字词
答案 0 :(得分:2)
Perl实现在替换评估部分会有所不同,但main idea是相同的:
使用交替捕获匹配来匹配不需要的上下文(即{.*?}
)或所需的子字符串(A
)(按特定顺序)。然后根据匹配的部分替换不需要的捕获与自身和所需的捕获取代:
my $input = "ABCDACD{ACDA}ABCD";
$input =~ s/({.*?})|(A)/{$2 ? "B" : $1}/ge;
答案 1 :(得分:1)
这是一个Perl解决方案,可以分步完成工作。首先,它将字符串拆分为支撑/非支撑项目的块。然后对未支撑的项目进行替换,最后再将项目重新组合在一起:
my $str = 'ABCDACD{ACDA}ABCD';
$str = do {
my $i = 1;
join '', map {$i++ % 2 && $_ =~ s/A/B/g; $_ } split /(\{.*?\})/, $str
};