我正在尝试用空格替换一些已解码的字符(例如\ x {2013},\ u {38}等)。以下是我使用的正则表达式。但是我收到Wide character
错误或者某些字符在打印消息中仍未正确解码。我认为这与表达不匹配,我尝试了不同的方法。我希望所有这些解码后的字符都有一些空间或 - 。请在下面找到我的非工作代码:
use strict;
use warnings;
my $sai = qq(Asdf \\u2013abc<br />jkl-abcd<br /><div>!\\"\\u00A3$%^&*()-_ =+</div><div>{</div><div>}</div><div>[</div><div>]</div><div>: ; @ \' # ~*,,</div><div>? > < . , / | \\\\ ` /* - + . </div><div> </div><div> 12345</div><div> </div><ul><li><span obj=\\"venit-rte-obj-026f68485\\">\\u00FC<span obj=\\"venit-rte-obj-0196185f4\\"> </span></span>Abcd</li><ul><li><span obj=\\"venit-rte-obj-026f68485\\">v<span obj=\\"venit-rte-obj-0196185f4\\"> </span></span>Abcd</li><li><span obj=\\"venit-rte-obj-026f68485\\">v<span obj=\\"venit-rte-obj-0196185f4\\"> </span></span>Jkl</li><ul><li><span obj=\\"venit-rte-obj-0a7a49fef\\">\\u00B7<span obj=\\"venit-rte-obj-0196185f4\\"> </span></span>Asdf</li></ul><li><span obj=\\"venit-rte-obj-026f68485\\">\\u00A7<span obj=\\"venit-rte-obj-0196185f4\\"> </span></span>test</li></ul></ul><div> </div><div> </div><div><ul><li><span obj=\\"venit-rte-obj-026f68485\\">\\u00D8<span obj=\\"venit-rte-obj-0196185f4\\"> </span></span>Dfgst</li><li><span obj=\\"venit-rte-obj-026f68485\\">\\u00D8<span obj=\\"venit-rte-obj-0196185f4\\"> </span></span>Sdrgdg</li><ul><li><span obj=\\"venit-rte-obj-0a7a49fef\\">\\u00B7<span obj=\\"venit-rte-obj-0196185f4\\"> </span></span>Abcd</li></ul></ul>Testing \\u2013 code</div> \x{2013};\x{2013}abcjkl-abcd!\"\x{a3} \$%^&*()-_=+{}[]: ;\@ ' # ~*,,? > AbcdTesting \x{2013} code670123456789 \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 :(得分: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;
答案 1 :(得分: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;