Regex 将字符串中的多个Unicode转换为字符
问题——我有一个字符串,比如说Regex 将字符串中的多个Unicode转换为字符,regex,string,perl,unicode,Regex,String,Perl,Unicode,问题——我有一个字符串,比如说Buna$002C\u TexasBuna$002C\u Texas,其中$后跟Unicode。我想用其各自的Unicode字符表示形式替换这些Unicode 在中,如果任何Unicode的格式为“\x{002C},则将其转换为相应的Unicode字符。下面是示例代码 #!/usr/bin/perl my $string = "Hello \x{263A}!\n"; @arr= split //,$string; print "@arr"; 我正在处理一个包含10
Buna$002C\u TexasBuna$002C\u Texas
,其中$
后跟Unicode。我想用其各自的Unicode字符表示形式替换这些Unicode
在中,如果任何Unicode的格式为“\x{002C}
,则将其转换为相应的Unicode字符。下面是示例代码
#!/usr/bin/perl
my $string = "Hello \x{263A}!\n";
@arr= split //,$string;
print "@arr";
我正在处理一个包含1000万条记录的文件。因此,我将这些字符串放在一个标量变量中。要执行与上面相同的操作,我将$4_digit_unicode
替换为\x{4_digit_unicode}
,如下所示
$str = 'Buna$002C_TexasBuna$002C_Texas';
$str =~s/\$(.{4})/\\x\{$1\}/g;
$str = "$str"
它给了我
Buna\x{002C}_TexasBuna\x{002C}_Texas
这是因为在$str=“$str”
,行$str
正在被插值,但不是它的值。因此\x{002C}
没有被Perl插值
有没有办法强制Perl也插入$str
的内容
或
有没有其他方法可以实现这一点?我不想取出每个Unicode,然后使用pack“U4”,0x002C
将其打包,然后将其替换回来。但是一行中的某些内容(如下面失败的尝试)是可以的
我知道上面的说法是错误的,但我能做类似的事情吗
对于输入字符串
$str='Buna$002C\u TexasBuna$002C\u Texas'
,所需的输出是Buna、\u TexasBuna、\u Texas
您可以在替换字符串中执行pack
等语句,只需使用e
正则表达式修饰符即可
或者你可以这样做
$str =~s/\$(.{4})/"@{[pack("U4",$1)]}/g;
如果这两个选项不起作用,请告诉我,请查看此选项以了解更多信息。这将提供所需的结果:
use strict;
use warnings;
use feature 'say';
my $str = 'Buna$002C_TexasBuna$002C_Texas';
$str =~s/\$(.{4})/chr(hex($1))/eg;
say $str;
主要有趣的项目是s///eg
中的e
。e
意味着将替换文本视为要执行的代码。hex()
将十六进制字符字符串转换为数字。chr()
将数字转换为字符。替换行最好按以下方式编写,以避免试图转换美元后跟非十六进制字符
$str =~s/\$([0-9a-f]{4})/chr(hex($1))/egi;
“\x{263A}”
(包括引号)是一个字符串文字,是一段代码,当解释器对其求值时(作为传递给perl
待求值脚本的一部分),它生成一个包含单个字符263A
的字符串
另一方面,“\\x\{$1\}”
(包括引号)生成一个字符串,该字符串由\
、x
、{
、$1
和}
的内容组成
后者是您正在生成的字符串。您似乎正在尝试生成Perl代码,但它不是有效的Perl代码--它缺少引号--而且您从未让Perl解释过代码
是的缩写
$str =~ s/\$(.{4})/ "\\x\{$1\}" /eg;
这完全不同于
$str =~ s/\$(.{4})/ "\x{263A}" /eg;
看起来您的目标是:
$str =~ s/\$(.{4})/ eval qq{"\\x\{$1\}"} /eg;
但是有更简单的方法来生成所需的字符串,例如
$str =~ s/\$(.{4})/ pack "U4", $1 /eg;
或者更好
$str =~ s/\$(.{4})/ chr hex $1 /eg;
$str =~ s/\$(.{4})/ pack "U4", $1 /eg;
$str =~ s/\$(.{4})/ chr hex $1 /eg;