Regex 替换正则表达式中的非捕获
我有一行是这样写的Regex 替换正则表达式中的非捕获,regex,perl,substitution,Regex,Perl,Substitution,我有一行是这样写的 NAME: ^?^?^, DOB: ^?^?^?^?, SN: ^?^? 由于我无法控制的原因,文件中出现了非打印字符。为此,我只需要匹配并删除出现在NAME、DOB和SN之后的内容 所以我正在测试名为的代码,这是我的正则表达式 $_ =~ s/(?:NAME: )[^[:print:]]//g) 预期产出为: NAME: , 然而,我得到: ^?^?^, 取而代之的是剥去名字?非捕获不起替代作用吗?非捕获组适用于您希望避免捕获所涉及的开销,或者您希望在捕获组中保留不
NAME: ^?^?^, DOB: ^?^?^?^?, SN: ^?^?
由于我无法控制的原因,文件中出现了非打印字符。为此,我只需要匹配并删除出现在NAME、DOB和SN之后的内容
所以我正在测试名为的代码,这是我的正则表达式
$_ =~ s/(?:NAME: )[^[:print:]]//g)
预期产出为:
NAME: ,
然而,我得到:
^?^?^,
取而代之的是剥去名字?非捕获不起替代作用吗?非捕获组适用于您希望避免捕获所涉及的开销,或者您希望在捕获组中保留不必要的内容,同时仍然能够对其进行分组的情况。你可以做的就是保留一些替代品
$_ =~ s/(NAME:)\P{print}+/$1/g;
将捕获Name:并将其替换回,或使用\K(保留)元字符:
$_ =~ s/NAME:\K\P{print}+//g;
这会阻止s///替换模式中剩余的任何内容
旁注:s///在$\上操作,除非变量是用=~,所以$\=~s///是多余的(但有些人可能会认为它传达了意图)。你知道,
[^[:print:]
一定是编写\p{print}
的最丑陋、最乏味的方式。我一直不明白为什么人们会使用笨重的POSIX符号。另外,你的正则表达式缺少一个repeatand,可能还有其他细节。我觉得这是一个编码问题。