除了空格之外,从字符串中删除特殊字符?

时间:2014-07-22 18:27:35

标签: regex perl

您好我试图删除数字和特殊字符,但以下字符串中的空格除外:

$string = 'ClA�\u0083A�A�ment Lecigne';

使用以下代码:

$string =~ tr/a-zA-Z//dc;

我们获得以下内容:

"ClAuAAmentLecigne" 

我真正需要的是:

"ClAuAAment Lecigne"

有人可以帮助我改进代码吗?谢谢,

2 个答案:

答案 0 :(得分:4)

有很多空白字符。

$ unichars '\s'
 ---- U+0009 CHARACTER TABULATION
 ---- U+000A LINE FEED
 ---- U+000B LINE TABULATION
 ---- U+000C FORM FEED
 ---- U+000D CARRIAGE RETURN
 ---- U+0020 SPACE
 ---- U+0085 NEXT LINE
 ---- U+00A0 NO-BREAK SPACE
 ---- U+1680 OGHAM SPACE MARK
 ---- U+2000 EN QUAD
 ---- U+2001 EM QUAD
 ---- U+2002 EN SPACE
 ---- U+2003 EM SPACE
 ---- U+2004 THREE-PER-EM SPACE
 ---- U+2005 FOUR-PER-EM SPACE
 ---- U+2006 SIX-PER-EM SPACE
 ---- U+2007 FIGURE SPACE
 ---- U+2008 PUNCTUATION SPACE
 ---- U+2009 THIN SPACE
 ---- U+200A HAIR SPACE
 ---- U+2028 LINE SEPARATOR
 ---- U+2029 PARAGRAPH SEPARATOR
 ---- U+202F NARROW NO-BREAK SPACE
 ---- U+205F MEDIUM MATHEMATICAL SPACE
 ---- U+3000 IDEOGRAPHIC SPACE

如果您想继续使用tr///,则必须全部列出

$string =~ tr/a-zA-Z\x09\x0A\x0B...\x{3000}//dc;

切换到s///更简单。

$string =~ s/[^\pL\s]//g;   # Remove all but letters and whitespace

答案 1 :(得分:2)

只需在tr/a-zA-Z //dc;

中添加空格即可
$string = 'ClA�\u0083A�A�ment Lecigne';
$string =~ tr/a-zA-Z //dc;
print $string . "\n";

输出:

ClAuAAment Lecigne