免费注册 查看新帖 |

Chinaunix

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

关于正则表达式的两个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-02 14:21 |只看该作者 |倒序浏览
本帖最后由 david_95 于 2015-07-02 14:22 编辑

1, 正则表达pattern 可以使用用变量, 但是如果变量中含有特殊字符(比如 [ . * \ ...),该怎么办?

比如我想搜索字符串$str 是否有 [  , 我写以下程序, 第一个if block 就没有生效,只有第二个查出了

sub testReg2{
        my $str="sdfsff\s[sdfsdf";
        my $mat="[";

        # this if block not work as expected
        if($str=~m/\$mat/g){
                print "find out with variable \n";
        }
        # this if block work
        if($str=~m/\[/g){
                print "find out with constant\n";
        }
}

2。 正则表达式 .  代表任意字符, 我想搜索3个字符的全排列, 写了以下程序,但是它没有全组合(用全组合不恰当,应该是依次排列的3个字符串),只是从第一个字符开始,依次找到3个字符
我想 bcd  cde ...igj 也应该是符合表达式的,为啥没找出呢? 我要怎么写才能用正则匹配写出 全部依次排列的3个字符串 呢?

sub testReg{
        my $str="abcdefghigj";
        my @tsr=$str=~/.../g;
        print "@tsr \n";
}
以上程序输出  abc def ghi

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
2 [报告]
发表于 2015-07-02 16:46 |只看该作者
1.用if($str=~m/\Q$mat\E/g)
2.点号是匹配所有,所以首先会把a匹配到
至于你说的匹配全部的,是不是需要循环啊?

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
3 [报告]
发表于 2015-07-02 16:54 |只看该作者
回复 1# david_95
但是如果变量中含有特殊字符(比如 [ . * \ ...),该怎么办?


my $a.b = 6;
my $bx* = 2;
是么

论坛徽章:
0
4 [报告]
发表于 2015-07-02 18:03 |只看该作者
回复 2# xiaoxingan99


谢谢啊,答案1 果然好使。 问题2 ,该怎么循环呢?

论坛徽章:
0
5 [报告]
发表于 2015-07-02 18:28 |只看该作者
本帖最后由 david_95 于 2015-07-02 18:29 编辑

我遇到一个奇葩的事,就是下面代码
        my $str="sdfsff/s[sdfsdf";
        my $mat="[";

        if($str=~/\Q$mat\E/g){        print "xx\n";        }

        if($str=~/sf/g){                print "yy\n";        }

只会输出第一个if block , 如果把第一个 if block 注释掉,第二个就work,输出  yy . 如果两个一起运行, 只输出 xx 第二个if block 不运行了, 这是什么灵异事件?
我以为perl 装的有问题,试了3个机器,都是这样,你们试试

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
6 [报告]
发表于 2015-07-03 09:05 |只看该作者
我试了也是这样,不过不懂为啥,好像是[的匹配引起的,等待高手吧!

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
7 [报告]
发表于 2015-07-03 14:59 |只看该作者
回复 6# xiaoxingan99
我试了也是这样
脑子转也转不动了
   

论坛徽章:
0
8 [报告]
发表于 2015-07-03 15:33 |只看该作者
我猜测是Perl 的一个bug , 搜了一个这样的文档: zhidao.baidu.com/question/52187484.html。 只有靠高人了。先不管它。
请大家考虑一下第二个问题
另外我从第二个问题联想到又一个问题: perl 正则如何从指定位置开始匹配查询?

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
9 [报告]
发表于 2015-07-03 16:37 |只看该作者
你说的是 substr()这个函数吧?

论坛徽章:
0
10 [报告]
发表于 2015-07-03 18:27 |只看该作者
回复 9# xiaoxingan99


除了这个节字符串,还有别的办法吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP