非替代正则表达式

时间:2014-07-02 16:21:22

标签: regex perl substitution

我有一行如下所示。

NAME: ^?^?^, DOB: ^?^?^?^?, SN: ^?^?

由于我无法控制的原因,非打印字符显示在文件中。为此,我只需匹配并删除仅在NAME,DOB和SN之后出现的那些。

所以我用NAME测试代码,这是我的正则表达式

$_ =~ s/(?:NAME: )[^[:print:]]//g)

预期输出为:

NAME: ,

然而,我得到了:

^?^?^,

取消名称?非捕获不能替代吗?

1 个答案:

答案 0 :(得分:1)

非捕获组用于何时您希望避免捕获所涉及的开销,或者您希望在捕获组中保留不必要的东西,同时仍然能够对它们进行分组。为了保留替代品,你可以做到

$_ =~ s/(NAME:)\P{print}+/$1/g;

将捕获Name:并将其替换回来,或者使用\ K(keep)元字符:

$_ =~ s/NAME:\K\P{print}+//g;

阻止s ///替换模式中剩下的任何内容。

旁注:s ///对$ _进行操作,除非使用=〜指定变量,因此$ _ = ~s ///是多余的(但有些人可能认为它传达了意图)。