perl:所有括号内的替换字符

时间:2016-04-07 19:28:31

标签: string perl character substitution brackets

我有这个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) ]";

有人可以帮帮我吗?

3 个答案:

答案 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

然后扫描数组,substrtr///一起使用,将所有逗号转换为这些子字符串中的点

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分别指代匹配前,匹配和匹配后变量。该比赛涉及最近的正则表达式匹配。