我有一条这样读取的行。无法捕获替换正则表达式
NAME: ^?^?^, DOB: ^?^?^?^?, SN: ^?^?
由于我无法控制的原因,非打印字符出现在文件中。为此,我只需要匹配并删除NAME,DOB和SN之后出现的那些。
所以我测试了与NAME的代码,这是我的正则表达式
$_ =~ s/(?:NAME:)[^[:print:]]//g)
预期输出是:
NAME: ,
但是,我得到:
^?^?^,
用名称剥离?非捕获不能在替代工作?
我有一条这样读取的行。无法捕获替换正则表达式
NAME: ^?^?^, DOB: ^?^?^?^?, SN: ^?^?
由于我无法控制的原因,非打印字符出现在文件中。为此,我只需要匹配并删除NAME,DOB和SN之后出现的那些。
所以我测试了与NAME的代码,这是我的正则表达式
$_ =~ s/(?:NAME:)[^[:print:]]//g)
预期输出是:
NAME: ,
但是,我得到:
^?^?^,
用名称剥离?非捕获不能在替代工作?
非捕获组适用于当您希望避免捕获所涉及的开销时,或者希望将不需要的事情从捕获组中排除而仍能够对其进行分组时。为了保持在一个替代的东西,你可以做
$_ =~ s/(NAME:)\P{print}+/$1/g;
这将捕获名称:和后面的替补,或者使用\ K(保持)元字符:
$_ =~ s/NAME:\K\P{print}+//g;
防止小号///从这个模式中代替它所剩下的任何东西。注意:s ///在$ _上运行,除非变量被指定为=〜,所以$ _ =〜s ///是多余的(但有些人可能会争辩它表达了意图)。
你知道,'[^ [:print:]]''是编写'\ P {print}'的最丑陋和最枯燥的方式,可以让人想到。我不明白为什么人们使用繁琐的POSIX符号。此外,你的正则表达式缺少重复和可能的其他细节。 – tchrist
闻起来像一个编码问题给我。 – tchrist