Regex \x不在替换内部工作
我正在尝试解码unicode字符。因此,我只是在正则表达式替换中尝试了十六进制转义序列Regex \x不在替换内部工作,regex,perl,unicode,Regex,Perl,Unicode,我正在尝试解码unicode字符。因此,我只是在正则表达式替换中尝试了十六进制转义序列\x{} use LWP::Simple; my $k = get("url"); my ($kv) =map{/js_call\(\\"(.+?)\\"\)/} $k; #now $kv data is https://someurl/call.pl?id=15967737\u0026locale=en-GB\u0026mkhun=ccce $kv=~s/\\u(.{4})/"\x{$1}"/eg;
\x{}
use LWP::Simple;
my $k = get("url");
my ($kv) =map{/js_call\(\\"(.+?)\\"\)/} $k;
#now $kv data is https://someurl/call.pl?id=15967737\u0026locale=en-GB\u0026mkhun=ccce
$kv=~s/\\u(.{4})/"\x{$1}"/eg;
我正在尝试替换全unicode字符
我的预期产出是:
https://someurl/call.pl?id=15967737&locale=en-GB&mkhun=ccce
下面提到的print
语句给出了预期的输出。然而,正则表达式似乎不能正常工作
print "\x{0026}";
如果启用
use warnings
,您将看到$1
在反向引用被插值之前被逐字计算
$kv =~ s/\\u(.{4})/ sprintf("\"\\x{%s}\"", $1) /eeg;
有点像作品,但它丑陋得可怕。我一直在尝试简化它,但我尝试过的各种想法总是让我回到“非法十六进制数字“$”被忽略”的警告。可能这也是您可以尝试的:
$kv=~s/\\u([:xdigit:]{1,5})/chr(eval(“0x$1”)/egis代码>
谢谢。s/\\u(.{4})/“\x{$1}”/e
的问题是反斜杠转义\x{$1}
是在编译时计算的,它给出一个空字节:
$ perl -E 'printf "%vX\n", "\x{$1}"'
0
如果我们对x
(s/\\u(.{4})/“\\x{$1}”/ge
)前面的反斜杠进行转义,我们将得到一个带有文字转义序列的字符串,但仍然不是所需的unicode字符:
use feature qw(say);
$kv = '\u0026';
$kv =~ s/\\u(.{4})/"\\x{$1}"/ge;
say $kv;
现在输出为:
\x{0026}
只需稍加修改,就可以生成“\x{0026}”
,这是可以编译和执行以生成所需值的Perl代码。为此,您需要参与eval(EXPR)
这可以缩短为
$kv =~ s/\\u(.{4})/ qq{"\\x{$1}"} /gee;
然而,更好的解决方案是使用以下方法:
$kv =~ s/\\u(.{4})/chr hex $1/ge;
$kv =~ s/\\u(.{4})/chr hex $1/ge;