关闭

一个正则切割问题

标签: stringperl任务php
781人阅读 评论(0) 收藏 举报
今天看到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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:137199次
    • 积分:2017
    • 等级:
    • 排名:第19069名
    • 原创:63篇
    • 转载:0篇
    • 译文:2篇
    • 评论:8条
    文章分类
    最新评论