2014-07-02 130 views
1

我有一条这样读取的行。无法捕获替换正则表达式

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

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

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

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

预期输出是:

NAME: , 

但是,我得到:

^?^?^, 

用名称剥离?非捕获不能在替代工作?

+0

闻起来像一个编码问题给我。 – tchrist

回答

1

非捕获组适用于当您希望避免捕获所涉及的开销时,或者希望将不需要的事情从捕获组中排除而仍能够对其进行分组时。为了保持在一个替代的东西,你可以做

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

这将捕获名称:和后面的替补,或者使用\ K(保持)元字符:

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

防止小号///从这个模式中代替它所剩下的任何东西。注意:s ///在$ _上运行,除非变量被指定为=〜,所以$ _ =〜s ///是多余的(但有些人可能会争辩它表达了意图)。

+0

你知道,'[^ [:print:]]''是编写'\ P {print}'的最丑陋和最枯燥的方式,可以让人想到。我不明白为什么人们使用繁琐的POSIX符号。此外,你的正则表达式缺少重复和可能的其他细节。 – tchrist