Perl:如何按空间分割中/英/数混合字符串?

时间:2015-01-15 09:32:24

标签: regex string perl

输入和预期输出如下所示:

今天天气好              ->    今 天 天 气 好
今天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 好

还有其他更好的方法来处理这个问题吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

您可以搜索此正则表达式:

(?<![a-zA-Z])(?<=[\p{L}\p{N}])|(?<!^)(?![a-zA-Z])(?=[\p{L}\p{N}])

并替换为:

" "

RegEx Demo

使用的标志:

  • 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