我想用短劃線替換具有某些Unicode值的字符。我有兩個想法可以工作,但我不知道如何檢查字符的值:檢查字符串內的字符以獲取其Unicode值
1 /處理變量作爲字符串,檢查每個字符值並將這些字符放在一個新變量中(替換那些字符是無效的)
2 /使用這些魔術:-)
$variable = s/[$char_range]/-/g;
char_range應類似於[0-9]
或[A-Z]
,但它應該爲UTF-8字符是數值。我需要從0x00到0x7F的範圍。
我想用短劃線替換具有某些Unicode值的字符。我有兩個想法可以工作,但我不知道如何檢查字符的值:檢查字符串內的字符以獲取其Unicode值
1 /處理變量作爲字符串,檢查每個字符值並將這些字符放在一個新變量中(替換那些字符是無效的)
2 /使用這些魔術:-)
$variable = s/[$char_range]/-/g;
char_range應類似於[0-9]
或[A-Z]
,但它應該爲UTF-8字符是數值。我需要從0x00到0x7F的範圍。
下面的表達式應該更換什麼,是不是有一個連字符,這是(我認爲)你想做什麼ASCII:
s/[\N{U+0080}-\N{U+FFFF}]/-/g
否定確實影響整個範圍不只是開始和結束價值?不應該是s/[\ N({U + 0080} - {U + FFFF})]/-/g – rluks 2012-04-06 20:14:56
\ N {}表示Unicode,而不是否定。字符類中的否定使用插入符號^。例如[^ 0-9]匹配不在0到9範圍內的任何內容。 – 2012-04-06 20:21:33
更簡單的方法是使用否定的屬性:'\ P {ASCII}'。對於一個特定的序數值,使用'\ x {#####}'''有點清晰。 – 2012-04-06 21:16:52
還有爲UTF-8字符沒有這樣的事情。只有您編碼爲UTF-8的字符。即使那樣,你也不想在Perl知道的魔法之外創建範圍。你可能會獲得比你期望的更多。
要得到一個字符的順序值,使用ord
:
use utf8;
my $code_number = ord ''; # U+1F638
say sprintf "%#x", $code_number;
不過,我不認爲這就是你所需要的。這聽起來像你想用-
替換ASCII範圍中的字符。您可以指定範圍內的編號:
s/[\000-\177]/-/g; # in octal
s/[\x00-\x7f]/-/g; # in hexadecimal
您可以在括號中註明寬字符順序值:
s/[\x80-\x{10ffff}]/-/g; # wide characters, replace non-ASCII in this case
當人物都有一個共同的屬性,你可以使用:
s/\p{ASCII}/-/g;
但是,如果要替換字符的字符,則可能需要音譯:
$string =~ tr/\000-\177/-/;
爲什麼你不編輯你的文章只是's /國/ -/g' ..? – 2012-04-07 01:33:13
我爲什麼要那樣做?我不是取代國家。我知道你是Perl新手,但是,正如你注意到的那樣,你會犯很多錯誤。您可能想退後一步,只讀一點答案。或者,學習Perl。 – 2012-04-07 02:08:34
使用ORD,這是一個很好的方式來做到這一點 – rluks 2012-04-07 07:33:28
從0x00到0x7F的字符範圍恰好是ASCII,那麼爲什麼要將UTF-8拖入此處? – jwodder 2012-04-06 19:21:36
有沒有這樣的事情作爲UTF-8字符。只有您編碼爲UTF-8的字符。 – 2012-04-06 21:09:57
感謝清除,順便說一句,這是有趣的http://perldoc.perl.org/Encode.html#UTF-8-vs.-utf8-vs.-UTF8 – rluks 2012-04-07 07:35:59