代码之家  ›  专栏  ›  技术社区  ›  fastcodejava

与12345匹配的正则表达式

  •  5
  • fastcodejava  · 技术社区  · 14 年前

    是否有一个regex来匹配不断增加的连续数字字符串,例如123、56789等? 我不认为它可以在雷杰克斯,但值得与这里的人核实。

    4 回复  |  直到 12 年前
        1
  •  6
  •   kennytm    14 年前
    ^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?(?:9$)?$
    

    结果: http://rubular.com/r/JfJJ6ntEQG

        2
  •  6
  •   John Kugelman Michael Hodel    14 年前
    ^(1|^)((2|^)((3|^)((4|^)((5|^)((6|^)((7|^)((8|^)((9|^))?)?)?)?)?)?)?)?$
    

    python演示:

    >>> import re
    >>> good  = ['1', '12', '123', '23', '3', '4', '45', '456', '56', '6', '7', '78', '789', '89', '9', '123456789']
    >>> bad   = ['a', '11', '13', '1345', '2459', '321', '641', '1 2', '222233334444']
    >>> tests = good + bad
    >>>
    >>> regex = '^(1|^)((2|^)((3|^)((4|^)((5|^)((6|^)((7|^)((8|^)((9|^))?)?)?)?)?)?)?)?$'
    >>> for test in tests:
    ...   print '%s: %s' % (re.match(regex, test) and 'Passed' or 'Failed', test)
    ... 
    Passed: 1
    Passed: 12
    Passed: 123
    Passed: 23
    Passed: 3
    Passed: 4
    Passed: 45
    Passed: 456
    Passed: 56
    Passed: 6
    Passed: 7
    Passed: 78
    Passed: 789
    Passed: 89
    Passed: 9
    Passed: 123456789
    Failed: a
    Failed: 11
    Failed: 13
    Failed: 1345
    Failed: 2459
    Failed: 321
    Failed: 641
    Failed: 1 2
    Failed: 222233334444
    
        3
  •  4
  •   tchrist    14 年前

    是否有一个regex来匹配不断增加的连续数字字符串,例如123、56789等?

    但是 当然 有,因为答案 全部的 问题开始了,是否有一个(perl)regex与_匹配?_157;总是__为什么,当然有!_157;操作问题始终是,__ 什么 Perl Regex是否匹配__?艾格斯

    简短回答

    Perl正则表达式如下:

    m{
      ^ (
          ( \d )
          (?(?= ( \d )) | $)
          (?(?{ ord $3 == 1 + ord $2 }) (?1) | $)
        ) $
    }x
    

    如果有两个不同的 (?(COND)THEN|ELSE) 条件组,其中递归组1作为第二个条件组的then子句。那是什么? (?1) 做。

    好极了,嗯?

    递归模式 像这些一样 酷酷 难以置信的强大; 用这种力量服务于善而非恶,这取决于你自己。艾斯

    我在下面给出的程序中使用了一种稍微不那么聪明的形式。我会把另一个放在它开始的地方,这样你就可以在Perl中看到它了。 有多种方法可以做到这一点 .

    完整的演示程序

    注意,不管怎样,这都有效 什么 Unicode数字的字符串,包括非ASCII(欢迎来到勇敢的新千年),甚至在语言停留在ucs-2(有时甚至是utf-16)上的星空平面上,都无法思考。

    此输出:

    Yes:       3456
     No:         43
    Yes:        567
     No:       1245
     No:        568
     No:        987
    Yes:         12
    Yes:      12345
     No:         24
     No:      13456
     No:   12354678
    Yes:   12345678
     No:       ١٣٠٢
    Yes:       ٤٥٦٧
     No:        २१३
    Yes:       ४५६७
    Yes:         ८९
     No:        ১১২
    Yes:       ৩৪৫৬
     No:       ৭৮৯৮
    Yes:         ௮௯
     No:         ௮௮
     No:       ๖๗๗๘
    Yes:        ๖๗๘
     No:    ༣༤༢༥༧༦༨
     No:      01132
    Yes:        234
    Yes:         89
    Yes:       𝟐𝟑𝟒𝟓
     No:       𝟓𝟒𝟑𝟐
     No:       𝟙𝟚𝟚𝟛
    Yes:       𝟛𝟜𝟝𝟞
    Yes:  𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵
    Yes:         𝟶𝟷
     No:      𝟸𝟹𝟺𝟼𝟻
    Yes:    𝟹𝟺𝟻𝟼𝟽𝟾𝟿
    

    由该程序生成:

    #!/usr/bin/env perl   
    use 5.10.0;
    use utf8;
    use strict;
    use autodie;
    use warnings  qw<  FATAL all     >;
    use open      qw< :std  :utf8    >;
    use charnames qw< :full          >;
    
    # to iterate is human…
    my @numbers = (
            3456,
              43,
             567,
            1245,
             568,
             987,
              12,
           12345,
              24,
           13456,
        12354678,
        12345678,
        hard_stuff(),
    );   
    my $ascending_rx = qr{
       ^ (  # works for *ANY* script!
            ( \p{Decimal_Number} ) 
            (?= $ | (??{ chr(1+ord($2)) }) )
            (?: (?1) | $ ) # …to recurse, divine!
        ) $
    }x;
    
    for my $n (@numbers) {
        printf "%s: %10s\n",
            ($n =~ $ascending_rx) ? "Yes" : " No",
            $n;
    }
    
    sub hard_stuff {   
        ( "\N{ARABIC-INDIC DIGIT ONE}"
        . "\N{ARABIC-INDIC DIGIT THREE}"
        . "\N{ARABIC-INDIC DIGIT ZERO}"
        . "\N{ARABIC-INDIC DIGIT TWO}"
        ),
        ( "\N{ARABIC-INDIC DIGIT FOUR}"
        . "\N{ARABIC-INDIC DIGIT FIVE}"
        . "\N{ARABIC-INDIC DIGIT SIX}"
        . "\N{ARABIC-INDIC DIGIT SEVEN}"
        ),
        ( "\N{DEVANAGARI DIGIT TWO}"
        . "\N{DEVANAGARI DIGIT ONE}"
        . "\N{DEVANAGARI DIGIT THREE}"
        ),
        ( "\N{DEVANAGARI DIGIT FOUR}"
        . "\N{DEVANAGARI DIGIT FIVE}"
        . "\N{DEVANAGARI DIGIT SIX}"
        . "\N{DEVANAGARI DIGIT SEVEN}"
        ),
        ( "\N{DEVANAGARI DIGIT EIGHT}"
        . "\N{DEVANAGARI DIGIT NINE}"
        ),
        ( "\N{BENGALI DIGIT ONE}"
        . "\N{BENGALI DIGIT ONE}"
        . "\N{BENGALI DIGIT TWO}"
        ),
        ( "\N{BENGALI DIGIT THREE}"
        . "\N{BENGALI DIGIT FOUR}"
        . "\N{BENGALI DIGIT FIVE}"
        . "\N{BENGALI DIGIT SIX}"
        ),
        ( "\N{BENGALI DIGIT SEVEN}"
        . "\N{BENGALI DIGIT EIGHT}"
        . "\N{BENGALI DIGIT NINE}"
        . "\N{BENGALI DIGIT EIGHT}"
        ),
        ( "\N{TAMIL DIGIT EIGHT}"
        . "\N{TAMIL DIGIT NINE}"
        ),
        ( "\N{TAMIL DIGIT EIGHT}"
        . "\N{TAMIL DIGIT EIGHT}"
        ),
        ( "\N{THAI DIGIT SIX}"
        . "\N{THAI DIGIT SEVEN}"
        . "\N{THAI DIGIT SEVEN}"
        . "\N{THAI DIGIT EIGHT}"
        ),
        ( "\N{THAI DIGIT SIX}"
        . "\N{THAI DIGIT SEVEN}"
        . "\N{THAI DIGIT EIGHT}"
        ),
        ( "\N{TIBETAN DIGIT THREE}"
        . "\N{TIBETAN DIGIT FOUR}"
        . "\N{TIBETAN DIGIT TWO}"
        . "\N{TIBETAN DIGIT FIVE}"
        . "\N{TIBETAN DIGIT SEVEN}"
        . "\N{TIBETAN DIGIT SIX}"
        . "\N{TIBETAN DIGIT EIGHT}"
        ),
        ( "\N{FULLWIDTH DIGIT ZERO}"
        . "\N{FULLWIDTH DIGIT ONE}"
        . "\N{FULLWIDTH DIGIT ONE}"
        . "\N{FULLWIDTH DIGIT THREE}"
        . "\N{FULLWIDTH DIGIT TWO}"
        ),
        ( "\N{FULLWIDTH DIGIT TWO}"
        . "\N{FULLWIDTH DIGIT THREE}"
        . "\N{FULLWIDTH DIGIT FOUR}"
        ),
        ( "\N{FULLWIDTH DIGIT EIGHT}"
        . "\N{FULLWIDTH DIGIT NINE}"
        ),
        #############################################
        #   Who's afraid of the astral planes?
        #   Try THIS, all you prisoners of UTF-16!
        #############################################
        ( "\N{MATHEMATICAL BOLD DIGIT TWO}"
        . "\N{MATHEMATICAL BOLD DIGIT THREE}"
        . "\N{MATHEMATICAL BOLD DIGIT FOUR}"
        . "\N{MATHEMATICAL BOLD DIGIT FIVE}"
        ),
        ( "\N{MATHEMATICAL BOLD DIGIT FIVE}"
        . "\N{MATHEMATICAL BOLD DIGIT FOUR}"
        . "\N{MATHEMATICAL BOLD DIGIT THREE}"
        . "\N{MATHEMATICAL BOLD DIGIT TWO}"
        ),
        ( "\N{MATHEMATICAL DOUBLE-STRUCK DIGIT ONE}"
        . "\N{MATHEMATICAL DOUBLE-STRUCK DIGIT TWO}"
        . "\N{MATHEMATICAL DOUBLE-STRUCK DIGIT TWO}"
        . "\N{MATHEMATICAL DOUBLE-STRUCK DIGIT THREE}"
        ),
        ( "\N{MATHEMATICAL DOUBLE-STRUCK DIGIT THREE}"
        . "\N{MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR}"
        . "\N{MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE}"
        . "\N{MATHEMATICAL DOUBLE-STRUCK DIGIT SIX}"
        ),
        ( "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT ONE}"
        . "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT TWO}"
        . "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT THREE}"
        . "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR}"
        . "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE}"
        . "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT SIX}"
        . "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN}"
        . "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT}"
        . "\N{MATHEMATICAL SANS-SERIF BOLD DIGIT NINE}"
        ),
        ( "\N{MATHEMATICAL MONOSPACE DIGIT ZERO}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT ONE}"
        ),
        ( "\N{MATHEMATICAL MONOSPACE DIGIT TWO}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT THREE}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT FOUR}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT SIX}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT FIVE}"
        ),
        ( "\N{MATHEMATICAL MONOSPACE DIGIT THREE}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT FOUR}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT FIVE}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT SIX}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT SEVEN}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT EIGHT}"
        . "\N{MATHEMATICAL MONOSPACE DIGIT NINE}"
        ),
    }
    

    附言:有人说原因是 有多种方法可以做到这一点 在Perl中,要弥补所有其他语言中 做这件事的方法通常是其中大部分。艾斯

        4
  •  2
  •   Bart Kiers    14 年前

    在Perl:

    my $prev = 0;
    
    while($string =~ s/^\s*(\d+)\s*,\s*(.*)/$2/is) {
        my $new = $1;
    
        if($new > $prev) { 
            #NUMBERS ARE GETTING LARGER
        } #if 
        else {
            #NUMBER GOT SMALLERS
        }
    }