2015-09-25 26 views
0

我試圖用空格替換一些已解碼的字符(例如\ x {2013},\ u {38}等)。以下是我使用的正則表達式。但是我收到了Wide character錯誤,或者某些字符在打印信息中仍然沒有正確解碼。我認爲這不符合表達,我嘗試了不同的方式。我想要所有那些帶有空格或 - 的解碼字符。請在下面找到我的非工作代碼:關於未知格式的Perl正則表達式

use strict; 
    use warnings; 

    my $sai = qq(Asdf \\u2013abc<br />jkl-abcd<br /><div>!\\"\\u00A3$%^&amp;*()-_  =+</div><div>{</div><div>}</div><div>[</div><div>]</div><div>: ; @ \' # ~*,,</div><div>? &gt; &lt; . ,/| \\\\ ` /* - + . &nbsp;</div><div>&nbsp;</div><div>&nbsp;12345</div><div>&nbsp;&nbsp;</div><ul><li><span obj=\\"venit-rte-obj-026f68485\\">\\u00FC<span obj=\\"venit-rte-obj-0196185f4\\">&nbsp;&nbsp;</span></span>Abcd</li><ul><li><span obj=\\"venit-rte-obj-026f68485\\">v<span obj=\\"venit-rte-obj-0196185f4\\">&nbsp;&nbsp;</span></span>Abcd</li><li><span obj=\\"venit-rte-obj-026f68485\\">v<span obj=\\"venit-rte-obj-0196185f4\\">&nbsp;&nbsp;</span></span>Jkl</li><ul><li><span obj=\\"venit-rte-obj-0a7a49fef\\">\\u00B7<span obj=\\"venit-rte-obj-0196185f4\\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>Asdf</li></ul><li><span obj=\\"venit-rte-obj-026f68485\\">\\u00A7<span obj=\\"venit-rte-obj-0196185f4\\">&nbsp;&nbsp;</span></span>test</li></ul></ul><div>&nbsp;</div><div>&nbsp;</div><div><ul><li><span obj=\\"venit-rte-obj-026f68485\\">\\u00D8<span obj=\\"venit-rte-obj-0196185f4\\">&nbsp;&nbsp;</span></span>Dfgst</li><li><span obj=\\"venit-rte-obj-026f68485\\">\\u00D8<span obj=\\"venit-rte-obj-0196185f4\\">&nbsp;&nbsp;</span></span>Sdrgdg</li><ul><li><span obj=\\"venit-rte-obj-0a7a49fef\\">\\u00B7<span obj=\\"venit-rte-obj-0196185f4\\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>Abcd</li></ul></ul>Testing \\u2013 code</div> \x{2013};\x{2013}abcjkl-abcd!\"\x{a3} \$%^&*()-_=+{}[]: ;\@ ' # ~*,,? > AbcdTesting \x{2013} code67\x{fc} Abcdv Abcdv Jkl\x{b7} Asdfs\x{a7} test \x{d8} Dfgst\x{d8} Sdrgdg\x{b7}); 

    for ($sai) 
    { 

    s/[^\p{ASCII}]//g; 
    s/\\u[0-9]+/-/g; 
    s/\\x[a-z0-9]/-/g; 

    } 

    print $sai; 

現在只有x {} D8和等沒有消失

+0

添加['使用UTF-8;'(https://ideone.com/Wc9XRz )。 –

回答

0

qq(雙引號)運營商支持像\x{2013}反斜槓序列,所以此:

my $process = qq(\x{2013}); 

聲明$process並將其初始化爲包含單個en dash(U + 2013)的字符串。

此:

$process =~ s/\\x\{[0-9]+\}//sg ; 

刪除像\x{2013}$process的任何序列;但它不包含任何這樣的序列,它包含的只是一個簡單的短劃線。

如果你的目標是去掉任何寬字符(字符以上的U + 007F),你可以這樣寫:

$process =~ s/[^\x00-\x7F]//g; 
+0

您好第一個答案,它的工作。第二個答案也是我認爲最好的,但沒有嘗試。 – Perl

+0

我會把我的整個程序放在這裏,因爲我仍然有幾個特殊字符的問題 – Perl

+0

嗨,ruakh,s/[^ \ x00- \ x7F] // g;正在刪除我的整個字符串:(你可以請我最新的更新代碼 – Perl

0

你的問題是\x{2013}不是某一段文字 - 這是一個Unicode字符。你正在使用正則表達式逃避它,所以正則表達式不匹配。

這將爲特定字符的工作:

my $process = qq(\x{2013}); 
$process =~ s/\x{2013}//sg ; 
print $process; 

但是,如果你想更常見的字符串中刪除Unicode字符:

my $process = qq(\x{2013}); 
$process =~ s/[^\w\s\d]+//g ; 
print $process; 

編輯:從意見 - 如果你只是想刪除'非ASCII碼 - 值得一看perlrecharclass

$process =~ s/[^\p{ASCII}]/-/g; 
+0

HI Sobrique,你能找到我的更新代碼並提供給我最好的解決方案嗎?作爲對我來說很重要的事情。謝謝 – Perl

+0

^\ w是什麼意思,它代替了我的其他\\「verit等..東西 – Perl

+0

'[^ \ w \ s \ d]'意思是」不是詞,空格或數字「 - 這是一種排除模式。爲了使用它,你只需要添加你想要保留的所有字符 – Sobrique