免费注册 查看新帖 |

Chinaunix

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

请教高手一个正则表达式问题,谢谢大家啦。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-25 11:58 |只看该作者 |倒序浏览
大家好,最近遇到一个正则匹配的问题,怎么搞都搞不定,请高手指点一下,谢谢啦。

输入文件:以其中一行为例
adad  [get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]  -dadad  [get_clocks ada {saew_sda wea_aa}]  dadas   [get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]  sdada [get_clocks ada {sewew_swea wwe_aa}]   [get_clocks ada {zzwew_sda efga_aa}]  dadsa

要求:
1,把所有get_pins  后面 {}内的内容,都加前缀yqx/,(内容之间是用空格分开的)
例如:[get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]
变成  [get_pins  sdad  {yqx/adad/sdad/sada  yqx/wewe/wew/wew  yqx/wew/asd}]

2,把所有get_clocks 后面 {}内的内容,都加前缀yqx_
例如: [get_clocks ada {sewew_swea wwe_aa}]
[get_clocks ada {yqx_sewew_swea yqx_wwe_aa}]   

每行的get_pins 和get_clocks数量不定,后面{}内的参数数量也不确定。但书写规则跟例子中一样,是固定的。
规则是[get_pins xxx {xxx xxx xxx}]
      [get_clocks xxx {xxx xxx xxx}]
我希望变成:
      [get_pins xxx {yqx/xxx yqx/xxx yqx/xxx}]
         [get_clocks xxx {yqx_xxx yqx_xxx yqx_xxx}]


我想请教一下,该如何对完成要求1,2中的替换。谢谢大家了。
我开始是这么实现的:
  1. if (/(\[get_pins.*?)(.*?)\}\]/) {
  2.       $change = $2;
  3.       $change ~= s/\s/\syqx\//g;
  4.       s/(\[get_pins.*?)(.*?)\}\]/$1yqx\/$change\}\]/g;
  5.       }
  6.       print;
复制代码
但匹配的不对,总是把一行中第一个$2的值,换给了后面所有的get_pins里。
对于get_clocks也是同样情况。
我想请教一下高手,这种替换该如何处理,谢谢大家啦。

上面的例子行,我希望替换完成后是:
adad  [get_pins  sdad  {yqx/adad/sdad/sada  yqx/wewe/wew/wew  yqx/wew/asd}]  -dadad  [get_clocks ada {yqx_saew_sda yqx_wea_aa}]  dadas   [get_pins  sdad  {yqx/adad/sdad/sada  yqx/wewe/wew/wew  yqx/wew/asd}]  sdada [get_clocks ada {yqx_sewew_swea yqx_wwe_aa}]   [get_clocks ada {yqx_zzwew_sda yqx_efga_aa}]  dadsa


请大家指点一下,非常感谢:)

论坛徽章:
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
2 [报告]
发表于 2011-11-25 12:53 |只看该作者
回复 1# xixizhihua


$ cat get_xxx.pl

use strict;
use warnings;

while(<DATA>){
  my @aData = split(/( \[|\] )/);
  my $sOut = "";
  foreach(@aData){
    if(m/^(get_\w+)(\s+\S+\s*)\{(.+)\}/){
      my ($sGet_xxx, $sMid, $sWord) = ($1,$2,$3);
      my $sAdd;
      $sWord=~ s!(\S+)!yqx/$1!g if($sGet_xxx eq "get_pins");
      $sWord=~ s!(\S+)!yqx_$1!g if($sGet_xxx eq "get_clocks");
      $_ = "$sGet_xxx$sMid\{$sWord\}";
    }
    $sOut .= $_;
  }
  print $sOut;
}
__DATA__
adad  [get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]  -dadad  [get_clocks ada {saew_sda wea_aa}]  dadas   [get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]  sdada [get_clocks ada {sewew_swea wwe_aa}]   [get_clocks ada {zzwew_sda efga_aa}]  dadsa


$ perl get_xxx.pl
adad  [get_pins  sdad  {yqx/adad/sdad/sada  yqx/wewe/wew/wew  yqx/wew/asd}]  -dadad  [get_clocks ada {yqx_saew_sda yqx_wea_aa}]  dadas   [get_pins  sdad  {yqx/adad/sdad/sada  yqx/wewe/wew/wew  yqx/wew/asd}]  sdada [get_clocks ada {yqx_sewew_swea yqx_wwe_aa}]   [get_clocks ada {yqx_zzwew_sda yqx_efga_aa}]  dadsa

论坛徽章:
0
3 [报告]
发表于 2011-11-25 13:46 |只看该作者
回复 1# xixizhihua

#!/usr/bin/perl

use strict;
use warnings;

my $string=<<EOL;
adad  [get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]  -dadad
[get_clocks ada {saew_sda wea_aa}]  dadas   [get_pins  sdad  {adad/sdad/sada
wewe/wew/wew  wew/asd}]  sdada [get_clocks ada {sewew_swea wwe_aa}]
[get_clocks ada {zzwew_sda efga_aa}]  dadsa
EOL

my @t_a = split /(\[[^\]]+\])/, $string;

for (@t_a) {
    $_=~/\bget_pins\b/ && $_=~s#\b(\w+(?:/\w+)+)#yqx/$1#g;
    $_=~/\bget_clocks\b/ && $_=~s#\b((?!get_)[a-z]+(?:_\w+)+)#yqx_$1#g;
}

print (join '', @t_a);

论坛徽章:
0
4 [报告]
发表于 2011-11-25 14:35 |只看该作者
太感谢楼上2位啦:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP