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

问题描述 投票:7回答:1

我有一个中文和英文字符相邻的声明:

我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]>/

如何匹配汉字?

regex perl6 raku
1个回答
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的字符。)

© www.soinside.com 2019 - 2024. All rights reserved.