在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4323|回复: 11

[求助] perl 如何匹配多行字符【已解决】

[复制链接]
发表于 2016-9-21 16:37:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 shinefuture 于 2016-9-23 16:37 编辑

比如有个变量$aa 它的值是以下多行字符:aaaaa
bbbbb
subckt aa pin1 pin2 pin3
cccc
dddd
ends
ffff
gggg

如何将 subckt到ends 这一大堆字符都替换掉
我尝试  $aa =~ s/\nsubckt.*\nends\n//;
这样不行,有人知道怎么替换吗?

谢谢
发表于 2016-9-22 09:49:22 | 显示全部楼层
回复 1# shinefuture


   感觉这样匹配应该没有问题,加个视为单行试试
    $aa =~ s/\nsub.*ends\n//s;
发表于 2016-9-22 10:36:14 | 显示全部楼层
$aa =~ s/subckt[\d\D]*ends//;
发表于 2016-9-22 10:36:57 | 显示全部楼层
$aa =~ s/subckt[\d\D]*ends//;
发表于 2016-9-22 14:41:53 | 显示全部楼层
回复 4# 南宫恨


   [\d\D]* 和 .* 貌似没有区别,但是匹配 [\d\D]* 会比匹配 .* 要慢…嗯…
发表于 2016-9-22 15:14:03 | 显示全部楼层
回复 5# mndzjsjczex
。*不能匹配换行符,这个可以
发表于 2016-9-22 15:41:11 | 显示全部楼层
回复 5# mndzjsjczex


    如果文件太大这样搜索会占时间,因为你自己写的那个不能匹配多行,所以很快失败了,这个是成功的但是文件行数太多,他会先匹配整个文件,然后是整个文件-1行这样一点点吐到匹配成功,可以使用非贪婪两次*?代替*
发表于 2016-9-22 16:18:15 | 显示全部楼层
回复 7# 南宫恨


   哦,原来[\d\D]是这么用的,明白了。
   我是根据LZ说的,多行文本在一个变量里的情况才选用/s视为单行的,也是可以成功的。

   如果要直接匹配多行文本,而不是在变量里的话,我觉得应该直接用
       my $flag;
       while (<$fh>) {
           if (/^.*?subckt.*(?:\n|$)/g) {
               $flag = 1;
               .......
           } elsif (/^.*?ends(.*)(?:\n|$)/) {
                   $flag = 0;
                   ......
              }
              next if ($flag);
              ......
         }
   这样匹配会稍快。


   没明白你说的用两次非贪婪代替的意思
发表于 2016-9-22 22:01:56 | 显示全部楼层
找本正则表达式的书看看
发表于 2016-9-23 06:55:36 | 显示全部楼层
回复 8# mndzjsjczex


    是非贪婪量词,打错了,普通量词. * ?都是尽可能匹配更多的,比如$a=xxxyyyzzzyyyzzzyyyzzz
    如果你的模式是/xxx*zzz/会匹配整个字符串,而/xxx*?zzz/只匹配xxxyyyzzz
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 04:00 , Processed in 0.028413 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表