+ -
当前位置:首页 → 问答吧 → perl 匹配递增数

perl 匹配递增数

时间:2010-09-21

来源:互联网

今天遇到个问题,如下
ABC: ABC为递增号码,例:123、234...678;
如写一个正则式匹配一下呢?
我写了好一会都没有搞定。

作者: bintre   发布时间: 2010-09-21

没想到正则怎么一步到位,变通下

print  if /^(\d)(\d)(\d)$/ && $2==$1+1 && $3==$2+1

作者: 99超人   发布时间: 2010-09-21

回复 99超人


    谢谢,学习了。

作者: bintre   发布时间: 2010-09-21

本帖最后由 珞水的大叔 于 2010-09-21 11:53 编辑

代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $lala = '1452905789321790';

  5. if ($lala =~ /(\d)((??{$1+1}))((??{$1+2}))/){
  6.     print "$1$2$3\n";
  7. }
复制代码
这里用了一个(??{$1+1})
这个(??{CODE}) 表示把CODE的执行结果插入正则表达式做匹配,$1是前面(\d)的匹配结果.
程序结果如下:
  1. 789
复制代码
所以说,perl很能干,嘿嘿

作者: 珞水的大叔   发布时间: 2010-09-21

回复 珞水的大叔


    漂亮。不错,所以我就喜欢用perl。

作者: bintre   发布时间: 2010-09-21

回复 珞水的大叔


    (??{CODE})
这种写法哪本书有介绍过,从来没看到过,不过确实好用

作者: 99超人   发布时间: 2010-09-21

LZ不妨看看这个:
?: 表示非捕获符号。就是什么也不匹配。
(?!pattern) 如果正则表达式在后面不匹配 pattern ,才会开始匹配。如/foo(?!bar)/,只有当出现 foo,并且后面不出现 bar 时才开始匹配.
Type                       Regex            Successful if the enclosed subexpression ...

Positive Lookbehind       (?<=......)        successful if can match to the left                        #例子:"abcdefg" =~ m/(?<=c)/;
                                                                                                                print $`,$&,$';

Negative Lookbehind       (?<!......)        successful if can not match to the left

Positive Lookahead        (?=......)         successful if can match to the right                       #例子: "abcdefg" =~ m/(?=c)/;
                                                                                                                print $`,$&,$';

Negative Lookahead        (?!......)         successful if can not match to the right


函数substr 也能达到目的

作者: leigh111   发布时间: 2010-09-21