Perl -如何用none替换不匹配的单词

bz4sfanl  于 2023-03-23  发布在  Perl
关注(0)|答案(4)|浏览(135)

我想用perl将字符串中不匹配的单词替换为none

$variable = "dx_app1_admin-101-102-prod;dx_app1_read-101-102-prod;dx_app2_admin-101-102-prod;dx_app2_admin-101-102-read;dx_app3_admin-101-102-prod;dx_app3_read-101-102-prod;";

$variable =~ s/?!(dx_app1_admin-101-102-prod;|dx_app1_read-101-102-prod;)//g;

print $variable;

预期输出:

dx_app1_admin-101-102-prod;dx_app1_read-101-102-prod;
8qgya5xd

8qgya5xd1#

一种方法:

my $variable = "dx_app1_admin-101-102-prod;dx_app1_read-101-102-prod;dx_app2_admin-101-102-prod;dx_app2_admin-101-102-read;dx_app3_admin-101-102-prod;dx_app3_read-101-102-prod;";
$variable = join ";", grep { /^dx_app1_(?:admin|read)/ } split /;/, $variable;
say $variable;
输出
dx_app1_admin-101-102-prod;dx_app1_read-101-102-prod
eeq64g8w

eeq64g8w2#

我不会用正则表达式。

my %keep = map { $_ => 1 } qw(
   dx_app1_admin-101-102-prod
   dx_app1_read-101-102-prod
);

say join ";", grep $keep{ $_ }, split /;/, $variable;
3mpgtkmj

3mpgtkmj3#

您可以替换负先行匹配后的所有单词字符:

$variable =~ s/\b(?!(car|truck|airplane);)\w+;//g;

或者,只使用分号作为分隔符(而不是单词边界):

$variable =~ s/((?<=;)|^)(?!(dx_app1_admin-101-102-prod|dx_app1_read-101-102-prod);)[^;]+;//g;
gwo2fgha

gwo2fgha4#

你可以使用SKIP FAIL来匹配你不想匹配的内容,然后匹配你想匹配的内容并替换为一个空字符串:

\bdx_app1_(?:read|admin)-101-102-prod;(*SKIP)(*FAIL)|[^\s;]+;

说明

  • \bdx_app1_(?:read|admin)-101-102-prod;匹配前面带有字边界的dx_app1_admin-101-102-prod;dx_app1_read-101-102-prod;,以防止部分字匹配
  • (*SKIP)(*FAIL)跳过比赛
  • |
  • [^\s;]+;匹配1+除;以外的字符或后跟匹配;的空格字符

看一个regex demo和一个perl演示。

$variable = "dx_app1_admin-101-102-prod;dx_app1_read-101-102-prod;dx_app2_admin-101-102-prod;dx_app2_admin-101-102-read;dx_app3_admin-101-102-prod;dx_app3_read-101-102-prod;";
$variable =~ s/\bdx_app1_(?:read|admin)-101-102-prod;(*SKIP)(*FAIL)|[^\s;]+;//g;

print $variable;

产出

dx_app1_admin-101-102-prod;dx_app1_read-101-102-prod;

相关问题