regex 如何使用从第二次出现开始搜索和替换

i7uq4tfw  于 2023-10-22  发布在  其他
关注(0)|答案(6)|浏览(169)

我正在编写一个脚本,我需要从第二次发生替换。我尝试了下面的代码,但输出与预期不匹配。

#!/usr/local/bin/perl;
use strict;
use warnings;

my $stg = "varun.kumar.ms.sri";
$stg =~ 's/\./\.x/2g';
print "$stg\n";

预期输出:

varun.kumar.xms.xsri

实际产量:

varun.kumar.ms.sri
6vl6ewon

6vl6ewon1#

首先,你的替换操作符使用了不正确的语法。不应该在s///周围使用单引号,而且/2不是一个可识别的修饰符。
第二,我不知道在一个正则表达式中有什么方法可以做到这一点。但是,有一种方法可以通过将字符串分成2部分,然后只在第2部分进行替换:

use strict;
use warnings;

my $stg = "varun.kumar.ms.sri";
my ($start, $rest) = split /\./, $stg, 2;
$rest =~ s/\./\.x/g;
$stg = "$start.$rest";
print "$stg\n";

图纸:

varun.kumar.xms.xsri

这将基于第一个.将字符串拆分为2部分,使用splitLIMIT为2。然后它在第二块中全局替换所有..x。最后,它重建完整的字符串。

fruv7luv

fruv7luv2#

也可以使用 *SKIP动词

$stg =~ s/^[^.]*\. (*SKIP)(*F) | \.\K/x/xg'

用于就绪测试的命令行程序

perl -wE'say "varun.kumar.ms.sri" =~ s/^[^.]*\.(*SKIP)(*F)|\.\K/x/rg'

上面的是“from second occurrence”--如果可以改变的话,添加一个量词

$stg =~ s/^(?:[^.]+\.){1} (*SKIP)(*F) | \.\K/x/xg'
o2gm4chl

o2gm4chl3#

完全包含在替换中的解决方案:

$stg =~ s{
   \. \K .*            # Replace what comes after the first `.`.
}{
   $& =~ s/\.\K/x/gr   # Transform the substring to replace.
}xse;
oug3syen

oug3syen4#

如果你要像前面的答案建议的那样使用split,那么你也可以使用以下代码:

my @parts = split( /\./, $stg, -1 );
$_ = "x$_" for @parts[ 2 .. $#parts ];
$stg = join( ".", @parts );

额外的好处:与toolic的解决方案不同,如果字符串不包含.,这个解决方案不会发出警告和失败。

aiqt4smr

aiqt4smr5#

另一个不做拆分的解决方案:

#!/usr/local/bin/perl;
use strict;
use warnings;

my $stg = "varun.kumar.ms.sri";

# Find the first dot. A global match in Boolean context finds them one
# at a time. We exit after the first, leaving the match position just
# after the first dot.
while ( $stg =~ m/\./g ) { last };

# Do the replacement on the substring that begins after the first dot.
# Since substr() is an lvalue subroutine, the underlying string gets
# modified.
substr( $stg, pos $stg ) =~ s/\./.x/g;

print "$stg\n"; # prints 'varun.kumar.xms.xsri'
zmeyuzjn

zmeyuzjn6#

要在一个 regex 中的第三个单词之前插入一个字符(x),您可以使用:用途:s/^(\w+\.\w+\.)/$1x/;
修改后的脚本:

#!/bin/env perl
use strict;
use warnings;

my $stg = "varun.kumar.ms.sri";
$stg =~ s/^(\w+\.\w+\.)/$1x/;
print "$stg\n";

将导致:

varun.kumar.xms.sri

相关问题