我有一行如下所示。
NAME: ^?^?^, DOB: ^?^?^?^?, SN: ^?^?
由于我无法控制的原因,非打印字符显示在文件中。为此,我只需匹配并删除仅在NAME,DOB和SN之后出现的那些。
所以我用NAME测试代码,这是我的正则表达式
$_ =~ s/(?:NAME: )[^[:print:]]//g)
预期输出为:
NAME: ,
然而,我得到了:
^?^?^,
取消名称?非捕获不能替代吗?
答案 0 :(得分:1)
非捕获组用于何时您希望避免捕获所涉及的开销,或者您希望在捕获组中保留不必要的东西,同时仍然能够对它们进行分组。为了保留替代品,你可以做到
$_ =~ s/(NAME:)\P{print}+/$1/g;
将捕获Name:并将其替换回来,或者使用\ K(keep)元字符:
$_ =~ s/NAME:\K\P{print}+//g;
阻止s ///替换模式中剩下的任何内容。
旁注:s ///对$ _进行操作,除非使用=〜指定变量,因此$ _ = ~s ///是多余的(但有些人可能认为它传达了意图)。