perl Regex:忽略几个不同位置上的字符

wbrvyc0a  于 2023-06-23  发布在  Perl
关注(0)|答案(3)|浏览(129)

给定此字符串:W1_R23_4_56_78
搜索的是:R2345678(在一场比赛中)全部来自第4位,没有任何_

^.{3}\K.[^_]*

给出R23
有可能得到一个匹配还是通过替换或。。
提前感谢引导正确的方向

9o685dep

9o685dep1#

my $x = "W1_R23_4_56_78" =~ s/^[^_]+|_//gr;

上面删除了最多(包括)第一个_。如果你真的想去掉三个位置,你可以用

my $x = "W1_R23_4_56_78" =~ s/^.{3}|_//sgr;

my $x = substr( "W1_R23_4_56_78", 3 ) =~ s/_//gr;
46qrfjad

46qrfjad2#

一种方法是捕获位置3之后的所有内容,不带下划线,并连接到所需的字符串中

my $str = 'W1_R23_4_56_78';

pos $str = 3;

my $res = join '', $str =~ /[^_]+/g;

pos允许更改下一次搜索的偏移量,参见文档。请注意,这会影响一些未来的操作(请参阅文档)。
下面的匹配是在列表上下文中,由join强加的,因此返回匹配。(在匹配的模式中,我们需要为想要的部分使用捕获括号,以便只返回那些部分。

arknldoa

arknldoa3#

在你的问题中,你说:
搜索的是:R2345678(在一场比赛中)全部来自第4位,没有任何_
但是你的模式^.{3}\K.[^_]*在第四个位置使用了一个点,它也可以匹配下划线。
所以在这个例子中,字符串W1__将匹配最后一个下划线。
如果您希望匹配至少3个字符,可以使用(*SKIP)(*F)而不是\K跳过前3个字符,然后匹配除下划线或换行符以外的所有其他字符。

^.{1,3}(*SKIP)(*F)|[^_\r\n]+

请参见regex demo
然后加入结果:

my $str = 'W1_R23_4_56_78';
my $result = join '', $str =~ /^.{1,3}(*SKIP)(*F)|[^_\r\n]+/g;
print($result);

输出量

R2345678

相关问题