免费注册 查看新帖 |

Chinaunix

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

碰到到的难题急:抽取多行字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-13 19:40 |只看该作者 |倒序浏览
#! /usr/local/bin/perl -w  
my $ititle;                                    
my $dip;                                         
$ititle ="ALARM 610 A2/BTS \"MMC2BSCR10/GB/0\"U 061213 1315
:EXTERNAL ALARM
:FAN
:GUANDUA
:END";                        
print $ititle;                                       
  Sample Text
if ($ititle =~ /如何写正则表达式???/)  
{                                                     
  $dip = $1;                                                                              
}                                                     
print $dip;

说明: 1)变量$ititle的值在“EXTERNAL ALARM”至“END”之间的信息会变,之间行数不定;
       2)要得到变量$dip值为:“EXTERNAL ALARM”至“END”之间的信息;
       3)求助if语句里面的条件怎么写?
知道的联系我:zengxiaosheng@boco.com.cn   谢谢。

论坛徽章:
0
2 [报告]
发表于 2006-12-13 19:54 |只看该作者
~/ /s

论坛徽章:
0
3 [报告]
发表于 2006-12-13 20:25 |只看该作者
原帖由 zengxiaosheng 于 2006-12-13 19:40 发表
#! /usr/local/bin/perl -w  
my $ititle;                                    
my $dip;                                         
$ititle ="ALARM 610 A2/BTS \"MMC2BSCR10/GB/0\"U 06121 ...


hello,

my $string =<<_TXT_;
ALARM 610 A2/BTS \"MMC2BSCR10/GB/0\"U 061213 1315
:EXTERNAL ALARM
:FAN
:GUANDUA
:DYNAMICAL RECORDS
:MORE
:END
_TXT_

# Fetching lines between :EXTERNAL ALARM and :END
my $patternStart = ':EXTERNAL ALARM';
my $patternEnd   = ':END';
if ($string =~ /$patternStart(.*)$patternEnd/s) {
    print $1;
}


--ulmer

论坛徽章:
0
4 [报告]
发表于 2006-12-14 12:12 |只看该作者

ulmer:if ($string =~ /$patternStart(.*)$patternEnd/s)

语句:if ($string =~ /$patternStart(.*)$patternEnd/s)
跟我的if($string=~ /.*EXTERNAL\s+ALARM\n(.*)\n:END)类似;
我做了测试,只能提取到之间的第一行“:FAN”,因为“.*”不能匹配换行符;
这谢谢ulmer,看看还有什么好方面吗?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-12-14 13:15 |只看该作者
不加//s..无法跨\n进行匹配..LZ要注意喔..
加了/s後..就可以跨行了...
ulmer的方法没错..

论坛徽章:
0
6 [报告]
发表于 2006-12-14 13:52 |只看该作者
//s,
学会了,谢谢!

论坛徽章:
0
7 [报告]
发表于 2006-12-14 18:14 |只看该作者
不知道为什么大家都这么喜欢用/s?个人感觉不是一个好习惯.为什么不用f/f操作符?
while (<DATA>) {
if (/:EXTER/../:END/) {
print ;
}
}


__DATA__
:EXTERNAL ALARM
:FAN
:GUANDUA
:END

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2006-12-14 18:21 |只看该作者
原帖由 xiaoyafeng 于 2006-12-14 18:14 发表
不知道为什么大家都这么喜欢用/s?个人感觉不是一个好习惯.为什么不用f/f操作符?
while (<DATA>) {
if (/:EXTER/../:END/) {
print ;
}
}


__DATA__
:EXTERNAL ALARM
:FAN
:GUANDUA
:END

如果是文件的话就最好用它,
但是如果本来就在一个字符串里了,那就不用了。
另外,Perl 的正则表达式太方便了,导致很多人用正则表达式用多了,习惯什么事情都用正则表达式来解决。其实这不是个好习惯。
比如说判断输入的命令是不是 quit 就用 /quit/,其实不精确,精确的写法是 /^quit$/ 甚至是 /^\Q$cmd$/(如果 quit 不是个直接量的话) 其实最后还是 $input eq $cmd 这样最简洁。
再比如说分离字符串,substr 几乎没人用,但是我觉得 substr 适当地用用要比全用正则效果好。还有 index 函数,几乎被人遗忘了。
另外 pack/unpack 在很多时候表现也要比正则表达式好。

论坛徽章:
0
9 [报告]
发表于 2006-12-14 18:27 |只看该作者
原帖由 xiaoyafeng 于 2006-12-14 18:14 发表
不知道为什么大家都这么喜欢用/s?个人感觉不是一个好习惯.为什么不用f/f操作符?
while (<DATA>) {
if (/:EXTER/../:END/) {
print ;
}
}


__DATA__
:EXTERNAL ALARM
:FAN
:GUANDUA
:END


__DATA__

f/f

可否详细介绍下

论坛徽章:
0
10 [报告]
发表于 2006-12-14 18:36 |只看该作者
原帖由 flw 于 2006-12-14 18:21 发表

如果是文件的话就最好用它,
但是如果本来就在一个字符串里了,那就不用了。
另外,Perl 的正则表达式太方便了,导致很多人用正则表达式用多了,习惯什么事情都用正则表达式来解决。其实这不是个好习惯。
比 ...

regex很耗内存,尤其是$&,$1之类,如果字符串很大还是不要用吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP