我有一个字符串,我想从中删除所有控制字符:
$line =~ s/[\000-\037]/ /smg;
但是在上面的正则表达式中我想控制除新行之外的所有字符。
例如,如果我有这样的字符串:
Thi **^@** s is an **^M**example **\n** for regex.
应用正则表达式之后,我的文本应该是这样的:
This is an example **\n** for regex.
答案 0 :(得分:1)
您可能会发现\w
和\d
宏非常有用。 http://perldoc.perl.org/perlre.html
$line =~ s/[^\w\s\n]+//msg;
将删除不是 word
whitespace
或linefeed
的任何内容。
这种方法应该扩展到解决你的问题,尽管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"
。