Regex 替换perl正则表达式匹配中的单个字符
如何替换正则表达式匹配中出现的第6个“ux” 下面是要搜索的文本输入。它不表示输入的路径:Regex 替换perl正则表达式匹配中的单个字符,regex,perl,Regex,Perl,如何替换正则表达式匹配中出现的第6个“ux” 下面是要搜索的文本输入。它不表示输入的路径: /Users/rob/Documents/Test/m160505_031746_42156_c100980652550000001823221307061611_s1_p0_30_0_59.fsa 这是我的代码,它解析出我需要的东西。我现在需要用“/”替换最后匹配的“\”: 期望输出: m160505_031746_42156_c100980652550000001823221307061611_s
/Users/rob/Documents/Test/m160505_031746_42156_c100980652550000001823221307061611_s1_p0_30_0_59.fsa
这是我的代码,它解析出我需要的东西。我现在需要用“/”替换最后匹配的“\”:
期望输出:
m160505_031746_42156_c100980652550000001823221307061611_s1_p0/30
我试过:
if ($line =~ s/(m160505_031746_42156_c100980652550000001823221307061611_s1_p0_[0-9]*)/(m160505_031746_42156_c100980652550000001823221307061611_s1_p0\/[0-9]*)/){
任何帮助都将不胜感激 根据您的描述,最简单的方法是:
$line =~ s!(m160505_031746_42156_c100980652550000001823221307061611_s1_p0)_!$1/!
我选择了代码>作为分隔符,因为更换零件中使用了/
$1
是一个变量,包含与正则表达式中第一个(
)
组匹配的文本(我不想重复整个过程两次)
最后的\uu
不包括在$1
中(不在合同范围内);相反,我们将/
放在替换零件中
有关更多信息,请参阅。此Perl代码将执行我认为您需要的操作,由主题行和示例输出确定
它在目标字符串中查找第六次出现的下划线,如果该下划线后跟十进制数字,则会将下划线更改为斜杠,并删除数字后面的所有内容
我已经使用管道字符|
作为替换运算符s///
的分隔符,以避免转义前斜杠
use strict;
use warnings 'all';
my $path = q{/Users/rob/Documents/Test/m160505_031746_42156_c100980652550000001823221307061611_s1_p0_30_0_59.fsa};
$path =~ s|^(?:[^_]*_){5}[^_]*\K_(\d+).*|/$1|s;
print $path, "\n";
输出
您在哪里尝试替换角色?我所看到的只是测试输入行是否与非常特定的情况匹配。所有行是否都以m160505\u 031746\u 42156\u C10098065255000000182322130706161\u s1\u p0\u开头?如果没有,为什么要进行测试?所有线路都以m160505\U 031746\U 42156\U C10098065255000000182322130706161\U s1\U p开头0_. 我只对更改比赛的最后一个下划线感兴趣。比赛结束后还有更多的下划线,我不需要更改。我已经展示了我在替换OP中的角色的尝试。s#u p0#u p0/#
应该是您所需要的一切……我仍然是一名学生,正在努力学习。我还不能回答问题。我已经尝试使用替换s//regex修饰符,如我的帖子所示。我也试着制作一个匹配的子字符串,用“u”替换“/”ie substr($line,62,1)=“/”,但这不起作用。我搜索过stackoverflow和其他网站。实际上,我认为split/\uu/
在这里是一个更好的选择。@Borodin这是一个判断。有时你会遇到一些初学者,他们试图理解文档,但他们一无所获。他们只需要看一个(评论过的)例子就可以理解发生了什么。例如,问题中的s///
代码几乎是有意义的,它只是尝试在右侧使用正则表达式(parens和[0-9]*
),这根本不是它的工作方式。我发布我的答案是希望帮助别人理解(我喜欢灯泡时刻),而不是为了分数。
$line =~ s!(m160505_031746_42156_c100980652550000001823221307061611_s1_p0)_!$1/!
use strict;
use warnings 'all';
my $path = q{/Users/rob/Documents/Test/m160505_031746_42156_c100980652550000001823221307061611_s1_p0_30_0_59.fsa};
$path =~ s|^(?:[^_]*_){5}[^_]*\K_(\d+).*|/$1|s;
print $path, "\n";
/Users/rob/Documents/Test/m160505_031746_42156_c100980652550000001823221307061611_s1_p0/30