Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 替换perl正则表达式匹配中的单个字符_Regex_Perl - Fatal编程技术网

Regex 替换perl正则表达式匹配中的单个字符

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

如何替换正则表达式匹配中出现的第6个“ux”

下面是要搜索的文本输入。它不表示输入的路径:

/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_p‌​‌​0)_!$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_p‌​‌​0)_!$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