我有一个声明,其中汉字和英文字符彼此相邻:
?Love Perl 6??
Run Code Online (Sandbox Code Playgroud)
我想在汉字和英文字符之间插入一个空格:
? Love Perl 6 ??
Run Code Online (Sandbox Code Playgroud)
我搜索\u4e00-\u9fa5
代表中文字符:
'?' ~~ /<[\u4e00..\u9fa5]>/
Run Code Online (Sandbox Code Playgroud)
但结果是:
Potential difficulties:
Repeated character (0) unexpectedly found in character class
at line 2
------> '?' ~~ /<[\u4e00..\?u9fa5]>/
Run Code Online (Sandbox Code Playgroud)
那怎么匹配一个汉字呢?
Bra*_*ert 13
主要问题是,这\u
不是一个有效的逃避.
> "\u4e00"
===SORRY!=== Error while compiling:
Unrecognized backslash sequence: '\u'
------> "\?u4e00"
Run Code Online (Sandbox Code Playgroud)
\x
虽然.
> "\x4e00"
?
Run Code Online (Sandbox Code Playgroud)
无论如何,您尝试使用的角色类并不涵盖所有中文字符.
> '?' ~~ /<[\x4e00..\x9fa5]>/
Nil
Run Code Online (Sandbox Code Playgroud)
您可能想要的是匹配脚本.
> '?' ~~ /<:Han>/
???
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,每次将新的字符集添加到Unicode时,您都不必一直更改字符类.
无论如何,您可以执行以下任何操作
# store in $0 and $1
say S/(<:Han>)(<:Latin>)/$0 $1/ given '?Love Perl 6??'
say S{(<:Han>)(<:Latin>)} = "$0 $1" given '?Love Perl 6??'
# same with subst
say '?Love Perl 6??'.subst: /(<:Han>)(<:Latin>)/, {"$0 $1"}
# only match between the two
say S/<:Han> <( )> <:Latin>/ / given '?Love Perl 6??'
say S{<:Han> <( )> <:Latin>} = ' ' given '?Love Perl 6??'
Run Code Online (Sandbox Code Playgroud)
要更改变量中的值,请使用s///
或.=subst
my $v = '?Love Perl 6??';
$v ~~ s/(<:Han>)(<:Latin>)/$0 $1/;
$v ~~ s{(<:Han>)(<:Latin>)} = "$0 $1";
$v ~~ s/<:Han> <()> <:Latin>/ /;
$v .= subst: /(<:Han>)(<:Latin>)/, {"$0 $1"};
$v .= subst: /<:Han> <()> <:Latin>/,' ';
Run Code Online (Sandbox Code Playgroud)
请注意,<(
导致在它之前忽略所有内容,并对)>
其后的所有内容执行相同操作.(可以单独使用).
您可能希望使用反向匹配来代替后续角色.
S/<:Han> <( )> [ <!:Han> & <!space> ]/ /
Run Code Online (Sandbox Code Playgroud)
(匹配一个字符,同时没有啥,而不是一个空格.)
归档时间: |
|
查看次数: |
386 次 |
最近记录: |