给定此字符串:W1_R23_4_56_78搜索的是:R2345678(在一场比赛中)全部来自第4位,没有任何_
W1_R23_4_56_78
^.{3}\K.[^_]*
给出R23有可能得到一个匹配还是通过替换或。。提前感谢引导正确的方向
R23
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;
46qrfjad2#
一种方法是捕获位置3之后的所有内容,不带下划线,并连接到所需的字符串中
my $str = 'W1_R23_4_56_78'; pos $str = 3; my $res = join '', $str =~ /[^_]+/g;
pos允许更改下一次搜索的偏移量,参见文档。请注意,这会影响一些未来的操作(请参阅文档)。下面的匹配是在列表上下文中,由join强加的,因此返回匹配。(在匹配的模式中,我们需要为想要的部分使用捕获括号,以便只返回那些部分。
join
arknldoa3#
在你的问题中,你说:搜索的是:R2345678(在一场比赛中)全部来自第4位,没有任何_但是你的模式^.{3}\K.[^_]*在第四个位置使用了一个点,它也可以匹配下划线。所以在这个例子中,字符串W1__将匹配最后一个下划线。如果您希望匹配至少3个字符,可以使用(*SKIP)(*F)而不是\K跳过前3个字符,然后匹配除下划线或换行符以外的所有其他字符。
W1__
(*SKIP)(*F)
\K
^.{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
3条答案
按热度按时间9o685dep1#
上面删除了最多(包括)第一个
_
。如果你真的想去掉三个位置,你可以用或
46qrfjad2#
一种方法是捕获位置3之后的所有内容,不带下划线,并连接到所需的字符串中
pos允许更改下一次搜索的偏移量,参见文档。请注意,这会影响一些未来的操作(请参阅文档)。
下面的匹配是在列表上下文中,由
join
强加的,因此返回匹配。(在匹配的模式中,我们需要为想要的部分使用捕获括号,以便只返回那些部分。arknldoa3#
在你的问题中,你说:
搜索的是:R2345678(在一场比赛中)全部来自第4位,没有任何_
但是你的模式
^.{3}\K.[^_]*
在第四个位置使用了一个点,它也可以匹配下划线。所以在这个例子中,字符串
W1__
将匹配最后一个下划线。如果您希望匹配至少3个字符,可以使用
(*SKIP)(*F)
而不是\K
跳过前3个字符,然后匹配除下划线或换行符以外的所有其他字符。请参见regex demo。
然后加入结果:
输出量