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

时间:2018-07-11 13:23:13

标签: regex perl6

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

我Love Perl 6哈哈

我想在中文字符和英文字符之间插入一个空格:

我 Love Perl 6 哈哈

我搜索\u4e00-\u9fa5代表汉字:

'哈' ~~ /<[\u4e00..\u9fa5]>/

但这会导致:

Potential difficulties:
Repeated character (0) unexpectedly found in character class
at line 2
------> '哈' ~~ /<[\u4e00..\⏏u9fa5]>/

那么如何匹配汉字?

1 个答案:

答案 0 :(得分:13)

主要问题是\u不是有效的转义符。

> "\u4e00"
===SORRY!=== Error while compiling:
Unrecognized backslash sequence: '\u'
------> "\⏏u4e00"

\x

> "\x4e00"
一

无论如何,您尝试使用的字符类并不能涵盖所有汉字。

> '㒠' ~~  /<[\x4e00..\x9fa5]>/ 
Nil

您可能想要在脚本上进行匹配。

> '㒠' ~~  /<:Han>/
「㒠」

这样做的好处是,不必在每次将新的字符集添加到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哈哈'

要更改变量中的值,请使用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>/,' ';

请注意,<(会忽略之前的所有内容,)>对其之后的所有内容都将执行相同的操作。 (可以单独使用)。

您可能想对后面的字符使用反向匹配。

S/<:Han> <( )> [ <!:Han> & <!space> ]/ /

(匹配同时不是 Han 而不是 space 的字符。)