我想将以下字符串中的“,”替换为@,但不以单位(10,000)格式更改它。
x,y,z
到x@y@z
x1,y1,z1
到x1@y1@z1
x1,y1 10,000,z1
到x1@y1 10,000@z1
我用过s/(\D),/\1@/g
,但它不适用于 2 和 3。如何识别排除模式是两边的数字?有人可以帮忙吗?非常感谢
您需要一个正则表达式,它表示要匹配左侧或右侧没有数字的逗号。
s/(?<!\d),|,(?!\d)/@/g
否定的lookbehind 断言(?<!\d)
允许匹配,例如x,
,因为x 不是数字。使用否定表达式允许它也匹配行的开头,例如,x
. 否定的前瞻断言(?!\d)
允许匹配不跟数字的逗号。这些表达式都不会匹配被数字包围的逗号。
尝试以下替代方法:
s/,(?<!\d)(?!\d)/\@/g;
示例脚本
use strict;
use warnings;
my @array = ( 'x,y,z', 'x1,y1,z1', 'x1,y1 10,000,z1');
for my $string (@array) {
$string =~ s/,(?<!\d)(?!\d)/\@/g;
print "$string\n";
}
#OUTPUT
#x@y@z
#x1@y1@z1
#x1@y1 10,000@z1