求助Perl 正则正则表达式 循环匹配配问题

本帖子已过去太久远了,不再提供回复功能。Perl怎么统计正则模式正确匹配到的次数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Perl怎么统计正则模式正确匹配到的次数
上传于|0|0|文档简介
&&Perl怎么统计正则模式正确匹配到的次数
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 26, 距离下一级还需 174 积分
论坛徽章:0
本帖最后由 watergun 于
11:26 编辑
请教各位一个问题啊. 我有一个字符串. 需要split成字符数组.
例子:&&例子中的A,B,C是任何可能长度的字符,或者数字.
$line=qq{A,A,B,C};
以前直接用@result = split (&,& $line);复制代码来处理.
后来发现有这种情况:
$line=qq{A,&A,A&,B,C};
需要把A,A当作一个来处理. 我就google了一个代码. 一直使用. 没问题.push(@fields, $+) while $line =~ m{
& && &&([^\&\\]*(?:\\.[^\&\\]*)*)&,?&&# groups the phrase inside the quotes
& && &| ([^,]+),?
& && &| ,
& && &}复制代码得到
昨天发现情况更复杂了...
$line=qq{A,&A,&A,A&&,B,C};
出现了一个&A,&A,A&& 需要匹配成单独的字符串.. 也就是双引号嵌套了. 而且嵌套里面还有逗号..
我不知道该怎么做这个split了..
想得到的结果是:
应该对应以&开头, 以&,或者&$为结束的为一个字符串. 其他都以,分割.
我对正则不是很擅长,麻烦有没有高手帮忙.
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 26, 距离下一级还需 174 积分
论坛徽章:0
有没有人帮忙啊... 谢谢了啊...
论坛徽章:95
& & 你这双引号一嵌套,外面的双引号和里面的要怎么区分?
白手起家, 积分 26, 距离下一级还需 174 积分
论坛徽章:0
本帖最后由 watergun 于
16:46 编辑
只有一中方法能区分
外面的双引号是以 &, 或者 &$ 为结尾的. 里面的不是.
整了快一天了.. 写不出来啊.
用 (\&([^\&]|[\&[^,]).*?)\&,)&&能匹配到第二和第三种的内容. 但是具体怎么做循环.. 还是一头雾水.
论坛徽章:95
& & 这个用正则做已经比较困难了,因为在扫描到 & 的时候要记录一些状态,你可以用 Parse::Lex 写个简单的 lexer,或者自己手写个也行:
#!/usr/bin/perl
use v5.12;
use Data::D
my $data = qq{sss1, 123, &sss2&, &sss3,sss4&, &sss5,&sss6,sss7&&, sss8, &sss9&};
my ($level, @token_buf, @token);
$level = 0;
my @chars = split //, $
while (my ($i, $c) = each @chars) {
& & given ($c) {
& & & & when (/,/) {
& & & && &&&if ($level & 0) {
& & & & & & & & push @token_buf, $c;
& & & && &&&} else {
& & & & & & & & push @token, (join '', @token_buf);
& & & & & & & & @token_buf = ();
& & & && &&&}
& & & & }
& & & & when (/&/) {
& & & && &&&my $nc = $chars[$i+1];
& & & && &&&if ($nc eq '&' or $nc eq ',' or !defined $nc) {
& & & & & & & & $level--;
& & & & & & & & push @token_buf, $c if $level & 0;
& & & && &&&} else {
& & & & & & & & push @token_buf, $c if $level & 0;
& & & & & & & & $level++;
& & & && &&&}
& & & & }
& & & & when (/ /) { }
& & & & default { push @token_buf, $c; }
& & }
}
push @token, (join '', @token_buf);
say &Data: $data&;
say Dumper(\@token);
复制代码
腰缠万贯, 积分 8618, 距离下一级还需 1382 积分
论坛徽章:26
对正则不擅长
我这么写了
___________________
___________________
___________________
A,&A,A&,B,C
___________________
___________________
A,&A,&A,A&&,B,C
___________________
___________________
A,&&A&,A&,B,C
___________________
C#!/usr/bin/perl
use 5.010;
while (&DATA&) {
& & my $line& &= $_;
& & my @result = SPLIT($line);
& & say '___________________';
& & print $_;
& & say '___________________';
& & say for @
}
sub SPLIT {
& & my $LINE& &=
& & my $APPEND = 0;
& & my @FIELDS;
& & for ( split /,|\n/, $LINE ) {
& && &&&$APPEND ? $FIELDS[-1] .= &,$_& : push @FIELDS, $_;
& && &&&my ( $PREFIX, $SUFIX ) = /^(&*)\w+(&*)$/;
& && &&&$APPEND += $PREFIX =~ tr/&// if $PREFIX;
& && &&&$APPEND -= $SUFIX =~ tr/&// if $SUFIX;
& & }
& & return @FIELDS;
}
__DATA__
A,A,B,C
A,&A,A&,B,C
A,&A,&A,A&&,B,C
A,&&A&,A&,B,C
复制代码
白手起家, 积分 26, 距离下一级还需 174 积分
论坛徽章:0
本帖最后由 watergun 于
18:12 编辑
非常非常感谢. 但是我在试着运行的时候遇到下面的错误.
Type of arg 1 to each must be hash (not private array) at ./double_quotes_test.pl line 13, near &@chars) &
应该是这行
while (my ($i, $c) = each @chars) {
这是为什么.. each应该用在哈希上吧. 能这样用在数组吗? 我不太理解.
白手起家, 积分 26, 距离下一级还需 174 积分
论坛徽章:0
本帖最后由 watergun 于
18:06 编辑
substr函数
非常非常感谢. 我给的例子运行的都没问题. 但是不知道怎么回事. 在实际运行的时候就失败了..&&实际的例子是:
IT-VME,IT-VME-VMWARE9,nonreplicated,BACKUP,&-vmfulltype=vstor -vmbackuptype=fullvm -asnodename=MITC&&-domain.vmfull=&VMHOST=vmware9.it-servers.louisville.-VM=Tegrity-Prod,*-NB,tsmpbw*,sp2010sql*,Print*,test-clus-sp*& -MODE=IFIncremental&,,5,,22:09:00,4,HOURS,,,&Sun,Mon,Tue,Wed,Thu,Fri,Sat&,, 15:40:12.000000,SYSDEE,
___________________IT-VME,IT-VME-VMWARE9,nonreplicated,BACKUP,&-vmfulltype=vstor -vmbackuptype=fullvm -asnodename=MITC -domain.vmfull=&VMHOST=vmware9.it-servers.louisville.-VM=Tegrity-Prod,*-NB,tsmpbw*,sp2010sql*,Print*,test-clus-sp*& -MODE=IFIncremental&,,5,,22:09:00,4,HOURS,,,&Sun,Mon,Tue,Wed,Thu,Fri,Sat&,, 15:40:12.000000,SYSDEE,
___________________
$VAR1 = 'IT-VME';
$VAR2 = 'IT-VME-VMWARE9';
$VAR3 = 'nonreplicated';
$VAR4 = 'BACKUP';
$VAR5 = '&-vmfulltype=vstor -vmbackuptype=fullvm -asnodename=MITC -domain.vmfull=&VMHOST=vmware9.it-servers.louisville.-VM=Tegrity-Prod';
$VAR6 = '*-NB';
$VAR7 = 'tsmpbw*';
$VAR8 = 'sp2010sql*';
$VAR9 = 'Print*';
$VAR10 = 'test-clus-sp*& -MODE=IFIncremental&';
$VAR11 = '';
$VAR12 = '5';
$VAR13 = '';
$VAR14 = '22:09:00';
$VAR15 = '4';
$VAR16 = 'HOURS';
$VAR17 = '';
$VAR18 = '';
$VAR19 = '&Sun,Mon,Tue,Wed,Thu,Fri,Sat&';
$VAR20 = '';
$VAR21 = ' 15:40:12.000000';
$VAR22 = 'SYSDEE';
复制代码在 Tegrity-Prod 这里被截断了. 不应该截断的. 我先去搞明白你的代码吧.. 太谢谢了.
论坛徽章:95
watergun 发表于
回复 5# MMMIX
each应该用在哈希上吧. 能这样用在数组吗?
这是 5.12 的新特性。
白手起家, 积分 26, 距离下一级还需 174 积分
论坛徽章:0
为什么我的环境就不行呢?[sguser@sg-rhel5-12 bin]$ sg-perl -v
This is perl, v5.8.1 built for i686-linux复制代码
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 perl 正则匹配变量 的文章

 

随机推荐