输入和预期输出如下所示:
今天天气好 -> 今 天 天 气 好
今天123天气好 -> 今 天 1 2 3 天 气 好
今天foo天气bar好 -> 今 天 foo 天 气 bar 好
foobar123 -> foobar 1 2 3
基本上,我希望英文单词完整,中文/数字间隔开。
我从以下开始,但仍然坚持如何修剪字符串的子字符串中的空格。
my $input_uttr = decode('UTF-8', $args{u})
my @token_list = split(/(?<=.)/, $input_uttr);
my $token_uttr = join(' ', @token_list);
$token_uttr =~ s/[a-z][\sa-z]+[a-z]/ /g;
具体来说,最后一行将取出所有字母字符串,例如
今天foo天气bar好 -> 今 天 天 气 好
有没有办法解决这个问题? 或者,我想知道是否有办法在字符串的子串中修剪空间:
今 天 f o o 天 气 b a r 好 -> 今 天 foo 天 气 bar 好
还有其他更好的方法来处理这个问题吗? 谢谢!
答案 0 :(得分:1)
您可以搜索此正则表达式:
(?<![a-zA-Z])(?<=[\p{L}\p{N}])|(?<!^)(?![a-zA-Z])(?=[\p{L}\p{N}])
并替换为:
" "
使用的标志:
g
for global u
支持unicode 此正则表达式使用交替来检查任何字符的左手或右手边是否为unicode字符或数字但不是ascii字母[A-Za-z]
。如果找到匹配,则使用空格进行替换。
#!/usr/bin/perl
use utf8;
my $str = '今天天气好
今天123天气好
今天foo天气bar好
foobar123';
$str =~ s/(?<![a-zA-Z])(?<=[\p{L}\p{N}])|(?<!^)(?![a-zA-Z])(?=[\p{L}\p{N}])/ /mg;
print $str . "\n";
今 天 天 气 好
今 天 1 2 3 天 气 好
今 天 foo 天 气 bar 好
foobar 1 2 3
答案 1 :(得分:1)
我会这样做:
use Modern::Perl;
use utf8;
while(<DATA>) {
chomp;
my @res = split(/(?<![a-z])|(?![a-z])/, $_);
say join ' ', @res;
}
__DATA__
今天天气好
今天123天气好
今天foo天气bar好
foobar123
<强>输出:强>
今 天 天 气 好
今 天 1 2 3 天 气 好
今 天 foo 天 气 bar 好
foobar 1 2 3