如何在汉字和英文字符之间插入空格?

che*_*nyf 7 regex perl6 raku

我有一个声明,其中汉字和英文字符彼此相邻:

?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)

(匹配一个字符,同时没有,而不是一个空格.)

  • perl6 -e 'say "我爱 Perl 6哈哈".subst(/(&lt;:Han&gt;)(&lt;:Latin&gt;)/, {"$0 $1"})' -- prints -- "我爱 Perl 6哈哈" 。仅对主题领域有一定的了解。 (3认同)