0

我想将以下字符串中的“,”替换为@,但不以单位(10,000)格式更改它。

  1. x,y,zx@y@z
  2. x1,y1,z1x1@y1@z1
  3. x1,y1 10,000,z1x1@y1 10,000@z1

我用过s/(\D),/\1@/g,但它不适用于 2 和 3。如何识别排除模式是两边的数字?有人可以帮忙吗?非常感谢

4

2 回答 2

5

您需要一个正则表达式,它表示要匹配左侧或右侧没有数字的逗号。

s/(?<!\d),|,(?!\d)/@/g

否定的lookbehind 断言(?<!\d)允许匹配,例如x,,因为x 不是数字。使用否定表达式允许它也匹配行的开头,例如,x. 否定的前瞻断言(?!\d)允许匹配不跟数字的逗号。这些表达式都不会匹配被数字包围的逗号。

于 2013-10-21T16:59:44.990 回答
0

尝试以下替代方法:

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
于 2013-10-21T16:53:02.883 回答