Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 替换正则表达式中的非捕获_Regex_Perl_Substitution - Fatal编程技术网

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,可能还有其他细节。我觉得这是一个编码问题。