Perl RegEx未知格式

时间:2015-09-25 14:37:45

标签: regex perl unicode

我正在尝试用空格替换一些已解码的字符(例如\ x {2013},\ u {38}等)。以下是我使用的正则表达式。但是我收到Wide character错误或者某些字符在打印消息中仍未正确解码。我认为这与表达不匹配,我尝试了不同的方法。我希望所有这些解码后的字符都有一些空间或 - 。请在下面找到我的非工作代码:

    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} 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}等等没有消失

2 个答案:

答案 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;