perl跳过正则表达式中的一个字符

时间:2015-03-27 12:50:33

标签: regex perl

我有一个字符串,我想从中删除所有控制字符:

$line =~ s/[\000-\037]/ /smg;

但是在上面的正则表达式中我想控制除新行之外的所有字符。

例如,如果我有这样的字符串:

Thi **^@** s is an **^M**example **\n** for regex.

应用正则表达式之后,我的文本应该是这样的:

This is an example **\n** for regex.

3 个答案:

答案 0 :(得分:1)

您可能会发现\w\d宏非常有用。 http://perldoc.perl.org/perlre.html

$line =~ s/[^\w\s\n]+//msg; 

将删除不是 word whitespacelinefeed的任何内容。

这种方法应该扩展到解决你的问题,尽管Borodin在评论中指出:

  

" ASCII集由\ p {Cntrl},\ p {Alpha},\ p {Number},\ p {Punct},\ p {Symbol}和空格字符覆盖。 \ s模式还将包括控制字符HT,VT,FF和CR,"

所以你可能想要相应地考虑因素。 (\w\s\d不会覆盖标点符号,例如)

答案 1 :(得分:1)

只需从字符类中删除换行符\012

[\000-\011\013-\037]

如果你想保留回车\015

[\000-\011\013\014\016-\037]

答案 2 :(得分:0)

您可以使用Unicode属性Cntrl来识别控制字符,因此/\p{Cntrl}/将匹配所有控制字符。

要从该范围中排除换行,请使用\P而不是\p取消换行,添加换行符并再次使用^取消它。所以

/[^\P{cntrl}\n]/

将匹配除换行符以外的所有控制字符。

请注意,\p{Cntrl}也匹配ASCII DEL("\x7F")和Unicode点"\x80""\x9F"