KDo*_*van 4 regex perl substitution
我正在编写从 Fortran 77 到 Fortran 90 的转换脚本,并尝试使用 PERL REGEX 替换每个 ! 如果在引号中找到,则带有 ~ 。
这个>'Hello !!!! Hello !!!!' 变成>'Hello ~~~~ Hello ~~~~'
这个>'Hello' !!!! 'Hello !!!!' 变成>'Hello' !!!! 'Hello ~~~~'
我不知道如何使用音译,因为它必须只在引号中使用我能做的最好的是:
perl -pi -e "s/('.*?)\!+(.*')/\1~\2/g" File.txt
Run Code Online (Sandbox Code Playgroud)
但这将 4 !s替换为 1~ 并且甚至不会更改第二组!s
这个>'Hello !!!! Hello !!!!' 变成>'Hello ~ Hello !!!!'
这个> 'Hello' !!!! 'Hello !!!!'变成>'Hello' !!!! 'Hello ~'
没有+之后\!它!无论如何只替换第一个所以你得到'Hello ~!!!'
我似乎无法计算每个!并用~. 我认为 Global/g会得到两组!s 但没有。
有什么想法吗?
匹配内引号很困难。这更容易一些,因为只有一种类型的引用。假设我们必须满足于\'转义,我们可以使用负向后看来查找未转义的引号:(?<!\\)'。/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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |