Perl REGEX代替!仅在用引号引起来时将〜括起来

问题描述 投票:0回答:1

我正在编写从Fortran 77到Fortran 90的转换脚本,并尝试使用PERL REGEX替代每一个!如果有引号,则带有〜。

此> 'Hello !!!! Hello !!!!'变为> 'Hello ~~~~ Hello ~~~~'

此> 'Hello' !!!! 'Hello !!!!'变为> 'Hello' !!!! 'Hello ~~~~'

我不知道如何使用音译,因为它只能在引号中使用我能做的最好的是:

perl -pi -e "s/('.*?)\!+(.*')/\1~\2/g" File.txt

但是这用1 !代替了4 ~,甚至没有改变第二组!

此> 'Hello !!!! Hello !!!!'变为> 'Hello ~ Hello !!!!'

此> 'Hello' !!!! 'Hello !!!!'变为> 'Hello' !!!! 'Hello ~'

+之后没有\!的情况下,无论如何它仅替换第一个!,所以您得到'Hello ~!!!'

我似乎无法计算每个!并用~一对一替换。而且我认为Global /g将同时获得两组!,但没有。

有什么想法吗?

regex perl substitution
1个回答
0
投票

匹配引号很困难。因为只有一种类型的报价,所以这有点容易。假设我们必须满足\'换码符的要求,我们可以在后面使用否定符查找未转义的引号:(?<!\\)'/s确保我们捕获任何换行符。 /g捕获字符串中的每个匹配项。

下一个技巧是捕获引号之间的所有文本,然后仅对其进行处理。我们可以使用/e来代替一些Perl代码,以对捕获的文本进行简单的翻译:tr/!/~/

use strict;
use warnings;
use v5.10;

my $str = qq['Hello' !!!! 'Hello !!!! I can\\'t hear you!\n'];

$str =~ s{
    (?<!\\)' (.*?) (?<!\\)'
}{
    my $inner = $1;
    $inner =~ tr/!/~/;
    "'$inner'";
}egmsx;

# 'Hello' !!!! 'Hello ~~~~ I can\'t hear you~
# '
say $str;
© www.soinside.com 2019 - 2024. All rights reserved.