我有这个PERL字符串:
my $string = "['-1XA0.55B',40,100,DU(26,3,20),100.00, DU(26,32,99) ]";
并希望替换所有()括号中的所有逗号,以获取:
my $string = "['-1XA0.55B',40,100,DU(26.3.20),100.00, DU(26.32.99) ]";
有人可以帮帮我吗?
答案 0 :(得分:0)
假设字符串将采用您列出的格式。最简单的答案是
my $string = "['-1XA0.55B',40,100,DU(26,3,20),100.00, DU(26,32,99) ]";
$string =~ s/DU\((\d*),(\d*),(\d*)\)/DU\($1.$2.$3\)/g;
print $string;
输出为['-1XA0.55B',40,100,DU(26.3.20),100.00,DU(26.32.99)]
我正在捕捉括号中的数字,并使用特殊变量$ 1,$ 2,$ 3作为替换的一部分。
答案 1 :(得分:0)
这是一种方式。它首先查找括号内的所有子字符串,并使用@-
和@+
内置数组来保存包含每个偏移量和长度的数组@substr
然后扫描数组,substr
与tr///
一起使用,将所有逗号转换为这些子字符串中的点
use strict;
use warnings 'all';
use feature 'say';
my $string = "['-1XA0.55B',40,100,DU(26,3,20),100.00, DU(26,32,99) ]";
my @substr;
push @substr, [ $-[1], $+[1]-$-[1] ] while $string =~ / \( ( [^()]* ) \) /gx;
substr($string, @$_) =~ tr/,/./ for @substr;
say $string;
['-1XA0.55B'.40.100.DU(26.3.20).100.00. DU(26.32.99) ]
答案 2 :(得分:0)
可以通过正则表达式替换来完成。但它仅限于简单的情况,并且在引用的字符串中没有嵌套的括号或括号,否则它将会中断。
use strict;
use warnings;
my $string = "['-1XA0.55B',40,100,DU(26,3,20),100.00, DU(26,32,99) ]";
$string =~ s/\([^()]*\)/$& =~ tr|,|.|r/ge;
print $string;
输出:
['-1XA0.55B',40,100,DU(26.3.20),100.00, DU(26.32.99) ]
我们所做的只是匹配文字括号,后跟可选的非括号,后跟另一个括号。然后我们获取匹配的字符串$&
并对其执行音译,将,
更改为.
,然后将其作为替换的替换部分返回。 /r
上的tr///
修饰符不会尝试更改$&
(这是只读的,所以我们不能),但只返回结果字符串而不更改{{1} }。替换$&
上的修饰符表示全局匹配,并且替换部分(音译)应该作为代码进行评估。
这也可以通过更详细的代码来完成,这些代码可能更具说明性,虽然更复杂
/ge
这里有很多代码可以模拟替换正则表达式的工作原理。请注意,我们必须在最后重置匹配位置,因为我们更改了use strict;
use warnings;
my $string = "['-1XA0.55B',40,100,DU(26,3,20),100.00, DU(26,32,99) ]";
while ($string =~ /\([^()]*\)/g) {
my $pos = pos($string); # remember where we were
my $match = $&; # copy the matched string
$match =~ tr/,/./; # alter the copy
$string = $` . $match . $'; # reassemble the string
pos($string) = $pos + length($match); # reset position
}
print $string;
变量,因此重置了迭代器。变量$string
分别指代匹配前,匹配和匹配后变量。该比赛涉及最近的正则表达式匹配。