【问题标题】:Perl RegEx on unknown format未知格式的 Perl RegEx
【发布时间】:2015-09-25 14:37:44
【问题描述】:

我正在尝试用空格替换一些解码字符(例如 \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} 等没有消失

【问题讨论】:

标签: regex perl unicode


【解决方案1】:

qq(双引号)运算符支持像\x{2013} 这样的反斜杠序列,因此:

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

声明 $process 并将其初始化为包含单个 en dash (U+2013) 的字符串。

这个:

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

$process 中删除像\x{2013} 这样的任何序列;但它不包括任何这样的序列,它只包含一个破折号。

如果您的目标是去除任何宽字符(U+007F 以上的字符),您可以这样写:

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

【讨论】:

  • HI 尝试了第一个答案并且有效。我认为第二个答案也是最好的,但还没有尝试。
  • 我会把我的整个程序放在这里。因为我仍然有一些特殊字符的问题
  • 嗨 ruakh, s/[^\x00-\x7F]//g;正在删除我的整个字符串 :(。你能请我最新更新的代码
  • 你的建议相当于他们使用的s/[^\p{ASCII}]//g
  • @Perl,不,它没有
【解决方案2】:

您的问题是 \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;

编辑:来自 cmets - 如果您只想删除 'non ASCII - 值得一看 perlrecharclass

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

【讨论】:

  • HI Sobrique,您能找到我的更新代码并为我提供最佳解决方案吗?因为它对我来说是一件重要的事情。谢谢
  • ^\w 是什么意思,它也正在取代我的其他 \\"verit 等等。
  • [^\w\s\d] 表示“不是单词、空格或数字”——它是一个排除模式。要使用它,您只需添加所有要保留的字符。
  • 哦,好的,我知道了。所以我想要所有的 ASCII 并且想要避免所有的非 ASCII。我该怎么写呢?
  • 嗨,谢谢你,即使我使用它,我仍然在输出中看到 \u2013 的东西:(
猜你喜欢
  • 2012-01-22
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多