2014-07-22 149 views
0

你好,我试图消除数字和特殊字符,除了从以下字符串中的空格:从字符串中删除除空格之外的特殊字符?

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

使用下面的代码:

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

我们得到如下:

"ClAuAAmentLecigne" 

我真正需要的是:

"ClAuAAment Lecigne" 

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

+2

“\ u0083”代表什么?它是一个单一的字符。为什么'u'被添加到期望的输出中? – Braj

+0

除了'a-zA-Z'什么都没有,你正在取代所有的东西,你为什么期望看到一个空间?此外,你应该看到'ClAAAmentLecigne'不是'ClAuAAmentLecigne'。 –

+0

@Braj这与字符ASCII和UTF8转换有关。我不知道这是什么意思。不过,我可以说这个\ u0083可能代表一个口音。 –

回答

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 
+0

谢谢,这也有帮助! –

2

就在tr/a-zA-Z //dc;

$string = 'ClA�\u0083A�A�ment Lecigne'; 
$string =~ tr/a-zA-Z //dc; 
print $string . "\n"; 

输出加上一个空格:

ClAuAAment Lecigne 
+0

输出中的u是在哪里:)当OP查找'ClAuAAment Lecigne' – Braj

+0

@braj,对于我来说,我认为perl正在将'\ u0083'解释为另一个字符。运行op代码时,我也没有得到'u'。我想,如果他看到了'u',它仍然适用于他。也许不同版本的Perl? – chilemagic

+0

@Matt它帮助了我!谢谢, –

相关问题