免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3204 | 回复: 6
打印 上一主题 下一主题

[测验]正则表达式命名捕获的替换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-14 01:34 |只看该作者 |倒序浏览
30可用积分
本帖最后由 Perlvim 于 2012-11-14 01:52 编辑

有一个字符串,里面有许多这样的结构
  1. my $str = '{aaa:ddd},{ddd:eee:fff:ggg},{abc:abc:abc},{bdc:xef:tks}';
复制代码
将大括号结构中有三个单词的结构中,第一个单词替换成key, 第二个替换成value,第三个替换成flag
  1. my $result = '{aaa:ddd},{ddd:eee:fff:ggg},{key1:value1:flag1},{key2:value2:flag2}';
复制代码
需要一个通用的解决方案, 一次捕获多个值,并分别进行替换。

如果有好的解决方案,我就不贴我自己的了。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2012-11-14 09:48 |只看该作者
  1. #!/usr/bin/perl

  2. use 5.016;
  3. my @f = qw/flag1 flag2 flag3/;
  4. my @k = qw/key1 key2 key3/;
  5. my @v = qw/val1 val2 val3/;
  6. my $i = 0;
  7. my $s = '{aaa:ddd},{ddd:eee:fff:ggg},{abc:abc:abc},{bdc:xef:tks}';

  8. $s =~ s/({)[^{:}]+:[^{:}]+:[^{:}]+(})/$1."$k[$i]:$v[$i]:$f[$i++]".$2/eg;
  9. say $s;
复制代码
  1. {aaa:ddd},{ddd:eee:fff:ggg},{key1:val1:flag1},{key2:val2:flag2}
复制代码

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
3 [报告]
发表于 2012-11-14 09:58 |只看该作者
本帖最后由 bikong0411 于 2012-11-14 09:59 编辑

perl -e 'my $str = "{aaa:ddd},{ddd:eee:fff:ggg},{abc:abc:abc},{bdcef:tks}";$str =~ s/\{(?:\w+)?:\w+)?:\w+)\}/$num++;sprintf "%s","{Key:value$num:flag$num}"/eg;print $str."\n";'

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
4 [报告]
发表于 2012-11-14 10:13 |只看该作者
  1. perl -le 'my $str = "{aaa:ddd},{ddd:eee:fff:ggg},{abc:abc:abc},{bdc:xef:tks}"; $str =~s/(?<={)(\w+):(\w+):(\w+)(?=})(?{$conut=1;$count++})/key.$count.":value".$count.":flag".$count/ge;print $str'
复制代码
和楼上貌似差不多

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2012-11-14 16:32 |只看该作者
  1. $str =~ s/(?<=\{)([^{}:]+:){2}[^{}:]+(?=\})/key1:value1:flag1/g;
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-11-14 21:23 |只看该作者
我的代码太多了,有50行。还是贴上来吧。
  1. #!perl

  2. use strict;
  3. use warnings;
  4. use 5.010;
  5. use YAML qw(Dump);

  6. our $cluster_id_str = {};

  7. my $str = '{aaa:ddd},{ddd:eee:fff:ggg},{abc:abc:abc},{bdc:xef:tks}';
  8. my $regexp = '{(?<key>\w+):(?<value>\w+):(?<flag>\w+)}';

  9. $str =~ s/($regexp)/replace_cluster_id($1,$regexp)/xmsge;
  10. say $str;

  11. # say Dump($cluster_id_str);
  12. # replace every captured str with cluster id str
  13. # If regexp have mulpity named capture structure,
  14. # could replace in same time
  15. sub replace_cluster_id {
  16.     my ($match_str, $regexp_str) = @_;
  17.     my $re_regexp_cluster = '\(\?\<([a-z_]+)\>';
  18.     my @cluster_name = $regexp_str =~ /$re_regexp_cluster/xmsg;
  19.     my @capture_str = $match_str =~ /$regexp_str/xmsg;
  20.     my @location_from = @-;
  21.     shift @location_from;
  22.     # Error check: if have error structure of regexp
  23.     if ((scalar @cluster_name != scalar @capture_str) or
  24.         (scalar @location_from != scalar @cluster_name)) {
  25.         say "Regexp $regexp_str have no name capture structure";
  26.         exit;
  27.     }
  28.     foreach my $i (reverse(0 .. $#cluster_name)) {
  29.         my $from = $location_from[$i];
  30.         my $length = length $capture_str[$i];
  31.         my $str = $capture_str[$i];
  32.         my $replace_id = apply_cluster_id($cluster_name[$i], $str);
  33.         substr($match_str, $from, $length, $replace_id);
  34.     }
  35.     return $match_str;
  36. }

  37. sub apply_cluster_id {
  38.     my ($flag, $str) = @_;
  39.     state $count = 0;
  40.     $count++;
  41.     my $id = sprintf("!%04d$flag!", $count);
  42.     $cluster_id_str->{$id} = $str;
  43.     return $id;
  44. }

复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
7 [报告]
发表于 2012-11-16 09:01 |只看该作者
太牛了,我试一下啊,多谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP