免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4406 | 回复: 14

【求助】求正则匹配这行里的某个逗号 [复制链接]

论坛徽章:
0
发表于 2015-06-23 10:27 |显示全部楼层
本帖最后由 beiyoulouluo 于 2015-06-24 10:10 编辑

我想将这句话:
宁为玉碎,不为瓦全,ning2wei2yu4sui4,bu4wei2wa3quan2
中第一个和第三个逗号给去掉,但怎么都匹配不上……
  1. my $tmp ="宁为玉碎,不为瓦全,ning2wei2yu4sui4,bu4wei2wa3quan2";
  2. $_ = $tmp;
  3. if(/.+(\,).+?\,.+?(\,).+/){
  4.         s/$1//;
  5.         s/$2//;
  6.     }
复制代码
$1可以匹配到,去掉第一个逗号,但$2是空的,怎么回事呢,
谢谢大家。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2015-06-24 09:57 |显示全部楼层
  1. /.+(\,).+?\,.+?(\,).+/
复制代码
点 . 后面的数量限定符一定要用非贪婪的,否则会直接匹配到文本最后。
要从头到尾的匹配,最好要加上断言,否则会出现不可预知的行为。
  1. /^.+?(\,).+?\,.+?(\,).+$/
复制代码

论坛徽章:
0
发表于 2015-06-24 10:08 |显示全部楼层
本帖最后由 beiyoulouluo 于 2015-06-24 10:21 编辑

回复 2# 104359176


不知为何删除了第一二个逗号
  1. if($tmp =~ /^.+?(\,).+?\,.+?(\,).+$/){
  2.         $tmp =~ s/$1//;
  3.         $tmp =~ s/$2//;
  4.     }
复制代码
结果
宁为玉碎不为瓦全ning2wei2yu4sui4,bu4wei2wa3quan2

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
发表于 2015-06-24 10:28 |显示全部楼层
回复 3# beiyoulouluo


    我的理解是,$1和$2匹配的都是逗号,所以$tmp =~ s/$1//;这一句将$tmp的第一个逗号删除,
        $tmp =~ s/$2//;这一句将$tmp的第二个逗号删除,

论坛徽章:
0
发表于 2015-06-24 10:32 |显示全部楼层
回复 4# xiaoxingan99


我也觉得是这个意思,不过那怎么删除第三个而保留第二个呢,
在进行第二次匹配的时候一定会先匹配到不想删除的那个逗号。

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
发表于 2015-06-24 10:38 |显示全部楼层
回复 5# beiyoulouluo

直接替换
my $tmp ="宁为玉碎,不为瓦全,ning2wei2yu4sui4,bu4wei2wa3quan2";
$tmp=~s/(.+)\,(.+?\,.+?)\,(.+)/$1$2$3/;
    print $tmp;

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-06-24 10:40 |显示全部楼层
@xiaoxingan99 @beiyoulouluo

每次正则都会"自动"更新$1,$2,...

所以这是错误用法...

if(/.+(\,).+?\,.+?(\,).+/){   # after RE, $1=","     $2=","
        s/$1//;      # s/,//;  # after RE, $1="", $2=""
        s/$2//;      # s///;   # after RE, $1="", $2=""
    }


$ echo '宁为玉碎,不为瓦全,ning2wei2yu4sui4,bu4wei2wa3quan2' | perl -pe '{if(/.+(\,).+?\,.+?(\,).+/){ s/$1//g}}'
宁为玉碎不为瓦全ning2wei2yu4sui4bu4wei2wa3quan2

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
发表于 2015-06-24 10:41 |显示全部楼层
s/$1//和s/,//没区别,$2也不是空,而是在s/$1//后$1和$2就改变了环境,换成了另外的正则

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
发表于 2015-06-24 10:43 |显示全部楼层
回复 7# jason680


    我刚刚也发现这个问题了,记得好像看过可以清除$1,$2内容的,找了一下没找到
是我记错了吗?

论坛徽章:
0
发表于 2015-06-24 10:44 |显示全部楼层
回复 6# xiaoxingan99


啊,对啊!好办法!学到了谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP