Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将字符串中的多个Unicode转换为字符_Regex_String_Perl_Unicode - Fatal编程技术网

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;