如何使用Perl在非ascii范围上编写RegEx

时间:2015-09-25 20:09:21

标签: regex perl unicode utf-8

我的输入是:

  

这是一个简单的文本,仅用于测试目的ascii文本   12345678910 - = [];'#/。, - 使用新的regexxx! “£$%^&   *()   _   + {}〜@:<>?| Asdf -jkll

现在我正在使用JSON解码我的输入数据,这些数据解码(html类型的响应ex:& nbsp,\ x {a3},& gt等...),如下所示:

  

这是一个简单的文本仅供测试用途ascii text12345678910 - = []; \'#/。,\\ - 使用新的regexxx!\“\ u00A3 $%^& *()_ + {}〜 @:<>?|
Asdf \ u2013jkll

现在我将这个解码数据发送到我的程序,用空格/或一些可打印字符替换这个unicode(utf-8)和其他非ascii字符(我的意思是我只想打印ascii范围字符) 所以,我在perl中尝试了以下所有内容。

use strict;
use warnings;
use JSON;
use LWP::UserAgent;
use utf8;
#Due to some security reasons I am not mentioning the url,hope u understand
my $ResRef = sendHTTPRequest($someurlRequest);
my $string = $ResRef->decoded_content;#I used json decode to decode content

my $string = transalte_replace($string);

sub transalte_replace {
my $string = shift;
    for($string) {
      s/\\u[0-9]+/1-/g;
      s/\\u[a-zA-Z0-9\+]*/2-/g;
      s/\\x\{[a-zA-Z0-9]*\}/3-/g;
      s/[^\p{ASCII}]/-/g;
      s/[^\u0000-\u007F]+/replace1/g;
      s/[^\x00-\x7F]+/rep/g;
      s/[^\p{ASCII}]/-/g;
      s/[^A-Za-z0-9\.,\?'""!@#\$%\^&\*\(\)-_=\+;:\<\>\/\\\|\}\{\[\]`\~]+/y/g;
      #s/[£]//g;
      s/[^\x20-\x7E]+/replace3/g;
      #s/\\u[0-9]+/2-/g;
      #s/\\x[a-z0-9]+/3-/g;
      #s/[^\x00-\x7F]/4-/g;
    }
}

输出仍然是:

  

“这是一个仅用于测试目的的简单文本ascii   text12345678910 - = [];'#/。,\ - with new   regexxx!\“\ x {a3} \ $%^&amp; *()_ + {}〜\ @:?| Asdf \ x {2013} jkll”;

我正在使用Windows环境,我只想要ascii范围的字符,数字和符号,而不是其他任何内容。请帮助

1 个答案:

答案 0 :(得分:5)

s/[^\p{ASCII}]/-/g

相当于

s/[^\x00-\x7F]/-/g

所以它不可能保持ACA3不变。

use strict;
use warnings;
use utf8;                             # Source code encoded using UTF-8.
use open ':std', ':encoding(UTF-8)';  # Terminal produces/expects UTF-8.
use feature qw( say );

my $string = q{¬`\\|!"£$%^&*()_+{}:@~<>?,./;'#[]=-0987654321:-+><};
say sprintf '%1$vX %1$s', $string;
$string =~ s/[^\p{ASCII}]/-/g;
say sprintf '%1$vX %1$s', $string;

输出:

$ perl a.pl
AC.60.5C.7C.21.22.A3.24.25.[...] ¬`\|!"£$%^&*()_+{}:@~<>?,./;'#[]=-0987654321:-+><
2D.60.5C.7C.21.22.2D.24.25.[...] -`\|!"-$%^&*()_+{}:@~<>?,./;'#[]=-0987654321:-+><
^^                ^^             ^     ^

您是否将s///运算符应用于正确的变量?