一个正则切割问题

今天看到csdn一个哥们说怎么把汉字两个两个的给以空格分开。
就是比如 ”我们的祖国是花园啊“  分成 ” 我们  的祖  国是  花园  啊“ 这样的形式。当时没有怎么想。回家来没事,索性研究了一下。

前提:
这个是在cu上抄的匹配中文字符的代码:
$d = "我的太阳";
@pattern = ('[/u4e00-/u9fff]','[^/u4e00-/u9fff]','[chr(0xa1)-chr(0xff)]','[^chr(0xa1)-chr(0xff)]','[/x80-/xff][/x80-/xff]','[^/x80-/xff][^/x80-/xff]','[/x80-/xff]','[^/x80-/xff]','[/u4e00-/u9fa5/uf900-/ufa2d]','[^/u4e00-/u9fa5/uf900-/ufa2d]','[/u4e00-/u9fa5]','[^/u4e00-/u9fa5]','[/x00-/xff]','[^/x00-/xff]');
foreach $p (@pattern)
{
    @result = ($d =~ /($p)/is);
    print "模式$p匹配结果为:@result/n";
}


故而 perl的解决如下:
$d = "我的太阳我的太阳你";
$d = reverse $d;
$d =~ s/(?<=([/x80-/xff][/x80-/xff]))(?=(([/x80-/xff][/x80-/xff]){2})+$)/-/g;
$d = reverse $d;
print  "$d";

这个办法有些笨,但是基本完成了任务。另外上perlmonk上请教了高人,记录了一下其他的解决方案:
$d =~ s/(/d/d)(?=/d)/$1-/g;

或者:

1 while $d =~ s/(?<=/d/d)(?=/d)/-/;
说到上面 1 while $d =~ s/(?<=/d/d)(?=/d)/-/; 这个,我就又想到了 $d =~ s/(?<=/d/d)(?=/d)/-/g; 同时比较了他们的区别:
1:
$d = "123456789";
while ($d =~ s/(?<=/d/d)(?=/d)/-/){
     print $d,$/;
}

2:
$d = "123456789";
$d =~ s/(?<=/d/d)(?=/d)(?{print $`,"/n"})/-/g;
print $d;

还不是很清楚,留在以后研究。另外,php的解决相应的也比较简单:

$string = "我的太阳我的太阳你";
echo  preg_replace("/([/x80-/xff][/x80-/xff][/x80-/xff][/x80-/xff])(?=[/x80-/xff][/x80-/xff])/is", "//1 ", $string);










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值