2014-07-22 112 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它幫助了我!謝謝, –

相關問題