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

String perl:替换所有括号内的字符,string,perl,character,substitution,brackets,String,Perl,Character,Substitution,Brackets,我有一个PERL字符串: my $string = "['-1XA0.55B',40,100,DU(26,3,20),100.00, DU(26,32,99) ]"; 并希望替换all()括号内的所有逗号,以获得: my $string = "['-1XA0.55B',40,100,DU(26.3.20),100.00, DU(26.32.99) ]"; 有人能帮我吗?假设字符串的格式与您列出的格式相同。最简单的答案是 my $string = "['-1XA0.55B',40,100,DU

我有一个PERL字符串:

my $string = "['-1XA0.55B',40,100,DU(26,3,20),100.00, DU(26,32,99) ]";
并希望替换all()括号内的所有逗号,以获得:

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) ]";
$string =~ s/DU\((\d*),(\d*),(\d*)\)/DU\($1.$2.$3\)/g;
print $string;
输出为['-1XA0.55B',40100,DU(26.3.20),100.00,DU(26.32.99)]


我捕获括号中的数字,并使用特殊变量$1、$2、$3作为替换的一部分。

这里有一种方法。它首先查找括号内的所有子字符串,并使用
@-
@+
内置数组保存包含每个子字符串的偏移量和长度的数组
@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)]

只需使用正则表达式替换即可。但它将仅限于简单的情况,并且没有嵌套的括号或带引号的字符串中的括号,否则它将中断

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) ]
我们所做的只是匹配一个文字括号,后跟可选的非括号,后跟另一个括号。然后,我们获取匹配的字符串
$&
,并对其执行音译,将
更改为
,然后将其作为替换的替换部分返回。
tr//
上的
/r
修饰符将不会尝试更改
$&
(这是只读的,因此我们无法更改),而只返回结果字符串而不更改
$&
。替换
/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
变量,从而重置迭代器。变量
$`$&$'
分别指匹配前、匹配后和匹配后的变量。引用最新正则表达式匹配的匹配。

最安全的方法是使用任何解析器读取该字符串,然后分别编辑有问题的特定字段和其他字符串。然后再次使用解析器以字符串格式输出数据。你有解析器吗?好主意。是的,我只写了一个小解析器,它解决了这个问题。谢谢;)帮助他理解你所做的事情。一个没有解释的答案对他基本的正则表达式没有帮助,他不知道该解释什么。我捕获括号中的数字,并使用特殊变量$1、$2、$3作为替换的一部分。您可以解释regexStackoverflow不是一个代码工厂,而是一个社区。当你写答案时,尽可能少的努力,尤其是当提问者是新手时