免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8228 | 回复: 23
上一主题 下一主题

perl 字符串替换问题, 困扰中 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-03 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-07 18:47 |只看该作者 |倒序浏览
本帖最后由 bt21cnzy21st 于 2015-07-08 16:39 编辑

我有一个字符串类似:

(1,1,{1,1},{1,1,{2,2},cco1{2,2},cbax[{2,2},{2,2}]},{ccp1[{2,2},{2,2}]})

这里面有大括号嵌套大括号, 我想做到的是将第二层大括号内的逗号,全部替换成 | 符号.


替换后效果如下:

(1,1,{1,1},{1,1,{2|2},cco1{2|2}|cbax[{2|2}|{2|2}]},{ccp1[{2|2}|{2|2}]})

这个shell应当如何写呢,我研究了好久, 求大神现身

--------------------------------------------------------------------------------------------------------------------------------------------------
20150708 add.

谢谢朋友的热心帮助, 十分感谢了。 不好意思了, 昨天是我把需求搞错了, 现在的需求是:

如下字符串:
(1,1,{1,1,cco1{x,x},cbax[{y,y},{z,z}]})

我需要将 cco1{x,x},cbax[{y,y},{z,z}] 块中的逗号,全部替换成 “|”,

替换后的效果如下:

(1,1,{1,1,cco1{x|x},cbax[{y|y}|{z|z}]})

现在需要将形如:cco1{}和cbax[{},{}]中的逗号全部替换

字符串中的cco1, cbax不确定,有可能还有其他名字如:cc02, cbax02等等。。。。

我对perl不太熟悉, 感谢热心的朋友,给个可以运行的代码,先谢谢了。






论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-03 06:20:00
2 [报告]
发表于 2015-07-07 18:57 |只看该作者
ding

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-03 06:20:00
3 [报告]
发表于 2015-07-07 19:04 |只看该作者
, 顶  顶  顶  顶

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-03 06:20:00
4 [报告]
发表于 2015-07-07 21:17 |只看该作者
顶 顶

论坛徽章:
3
2015亚冠之阿尔希拉尔
日期:2015-08-15 16:33:2215-16赛季CBA联赛之四川
日期:2016-01-03 13:37:0515-16赛季CBA联赛之四川
日期:2016-06-13 15:53:36
5 [报告]
发表于 2015-07-07 22:08 |只看该作者
本帖最后由 minirain 于 2015-07-07 22:18 编辑

bt21cnzy21st 发表于 2015-07-07 18:47
我有一个字符串类似:
(1,1,{1,1},{1,1,{2,2},cco1{2,2},cbax[{2,2},{2,2}]},{ccp1[{2,2},{2,2}]})
(1,1,{1,1},{1,1,{2|2},cco1{2|2}|cbax[{2|2}|{2|2}]},{ccp1[{2|2}|{2|2}]})
上面红色“|”全是属于花括号第一层,不属于第二层!


我明天告诉你吧。
{ccp1[{2|2}|{2|2}]}->{ccp1[{2|2}{2|2}]},红色逗号不属于第二层括号,怎么改成“|”。规则不清楚是很难搞出来的!!!

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
6 [报告]
发表于 2015-07-07 22:20 |只看该作者
本帖最后由 104359176 于 2015-07-07 23:11 编辑

正则表达式是一门描述字符串的语言,但缺少递归和符号,Perl5 表示递归和符号的规则隐晦,难以理解,难以表述,这类问题,只能用有限的迭代来解决。
  1. use 5.012;

  2. my $str = '(1,1,{1,1},{1,1,{2,2},cco1{2,2},cbax[{2,2},{2,2}]},{ccp1[{2,2},{2,2}]})';

  3. $str =~ s/
  4. (?<=\{) # 不捕获开始大括号
  5. (
  6. (?:\{.*?\} | [^\{\}]+)+ 大括号必须是成对的,而且只能有一层
  7. )
  8. (?=\})  # 不捕获结束大括号
  9. /replace_str($1)/xmsge;

  10. say $str;

  11. sub replace_str {
  12.   my $str = shift;
  13.   $str =~ s/(\{.*?\})/replace_comma($1)/ge;
  14.   return $str;
  15. }

  16. sub replace_comma {
  17.   my $str = shift;
  18.   $str =~ s/,/:/g;
  19.   return $str;
  20. }
复制代码

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
7 [报告]
发表于 2015-07-08 09:27 |只看该作者
本帖最后由 songyc_2015 于 2015-07-08 09:30 编辑

回复 6# 104359176
太牛,学习了~~~~,s///xmsge中的x和m选项是什么意思,可否解释一下吗?

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
8 [报告]
发表于 2015-07-08 09:28 |只看该作者
回复 1# bt21cnzy21st
  1. $cat test.pl
  2. #!/usr/bin/env perl
  3. use strict;
  4. use warnings;
  5. use Data::Dumper;

  6. my $str = '(1,1,{1,1},{1,1,{2,2},cco1{2,2},cbax[{2,2},{2,2}]},{ccp1[{2,2},{2,2}]})';
  7. my @arr = split /,/, $str;
  8. my ($flag, $rs) = (0, "");
  9. for my $item (@arr)
  10. {
  11.         $flag++ if $item =~ /{/;
  12.         $flag-- if $item =~ /}/;
  13.         $item = $flag eq 2 ? $item."|" : $item.",";
  14.         $rs .= $item;
  15. }
  16. $rs =~ s/,$//;
  17. print $rs, "\n";
  18. $perl test.pl
复制代码

论坛徽章:
3
2015亚冠之阿尔希拉尔
日期:2015-08-15 16:33:2215-16赛季CBA联赛之四川
日期:2016-01-03 13:37:0515-16赛季CBA联赛之四川
日期:2016-06-13 15:53:36
9 [报告]
发表于 2015-07-08 11:16 |只看该作者
本帖最后由 minirain 于 2015-07-09 14:38 编辑

回复 8# songyc_2015
  1. #!/usr/bin/env perl

  2. use strict;
  3. use warnings;


  4. my ($nested);

  5. my $string = '(1,1,{1,1},{1,1,{2,2},cco1{2,2},cbax[{2,2},{2,2}]},{ccp1[{2,2},{2,2}]})';
  6.    $string =~ s/((?:\{)|(?:\}))/($1 eq "\{") ?
  7.                                          "\!".($nested++).$1:
  8.                                             ($nested > 0)?$1.(--$nested)."\!":$1/gxe ;  #用!0 0!、!1 1!、!2 2!标记{层级1层、2层、3层

  9. my $nest = 1;# 0为{第1层级,1为{第2层级
  10. $string =~ s/\!$nest(.*?)$nest\!/($a=$1,$a=~s^\,^\|^g,$a)/ge ;
  11. $string =~ s/\!\d+//g; $string =~ s/\d+\!//g;

  12. print $string, "\n";
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-03 06:20:00
10
发表于 2015-07-08 16:35
回复 5# minirain


谢谢朋友的热心帮助, 十分感谢了。 不好意思了, 昨天是我把需求搞错了, 现在的需求是:

如下字符串:
(1,1,{1,1,cco1{x,x},cbax[{y,y},{z,z}]})

我需要将 cco1{x,x},cbax[{y,y},{z,z}] 块中的逗号,全部替换成 “|”,

替换后的效果如下:

(1,1,{1,1,cco1{x|x},cbax[{y|y}|{z|z}]})

现在需要将形如:cco1{}和cbax[{},{}]中的逗号全部替换

字符串中的cco1, cbax不确定,有可能还有其他名字如:cc02, cbax02等等。。。。

我对perl不太熟悉, 感谢热心的朋友,给个可以运行的代码,先谢谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP