【问题标题】:Matching incremental digits in numbers匹配数字中的增量数字
【发布时间】:2014-11-06 20:02:08
【问题描述】:

在谷歌上搜索了很多天后,最后我在这里发布了这个问题,希望在这里得到专家的解决;我正在寻找可以匹配增量反向引用的正则表达式模式。让我解释一下:

对于数字9422512322,模式(\d)\1 将匹配22 两次,我想要匹配12 的模式(类似于(\d)\1+1)(second digit 等于first digit + 1

简而言之,模式应该匹配所有出现的情况,例如1223344556 等...没有替换,只需要匹配即可。

【问题讨论】:

  • 你忘了指明你使用的是什么语言?!

标签: regex backreference capturing-group


【解决方案1】:

这样的事情呢?

/01|12|23|34|45|56|67|78|89/

它并不性感,但它可以完成工作。

【讨论】:

  • 这个正则表达式不会匹配子字符串“123”中的“23”,因为它首先匹配“12”。匹配操作的当前位置一旦匹配到“12”,就会放在“2”之后,因此看不到“23”。您或许可以使用zero-width positive lookahead assertions 解决此问题。
  • @SamChoukri:两件事:首先,查找重叠匹配不是这个特定正则表达式的问题,而是一般正则表达式的问题,无论模式如何。其次,您可以通过在循环中使用表达式来解决它,在该循环中,您可以使用前一个匹配项的开始位置加上 1 来找到下一个匹配项。
【解决方案2】:

你可以使用这个正则表达式:

(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9))+.

这将匹配:

  • 任何0s 后跟1s,或
  • 任何1s 后跟2s,或
  • 任何2s 后跟3s,...

多次+,然后匹配对应的字符.

这里是regex demo,匹配的是:

12345555567877785

【讨论】:

    【解决方案3】:

    您可以在 Perl 正则表达式中运行代码,
    控制正则表达式的执行流程。但是,这不太可能
    在其他任何地方实施到这种程度。

    PCRE 有一些程序变量交互,但不像 Perl。
    (注意 - 要进行重叠查找,请将第二个 ( \d ) 替换为 (?=( \d ))
    然后将打印语句更改为print "Overlap Found $1$3\n";

    如果你使用 Perl,你可以做各种不可能的数学-字符关系
    用蛮力排列完成。

    - 祝你好运!

    Perl 示例:

    use strict;
    use warnings;
    
    my $dig2;
    while ( "9342251232288 6709090156" =~
              /
                   (
                        ( \d )
                        (?{ $dig2 = $^N + 1 })
                        ( \d )
                        (?(?{
                             $dig2 != $^N
                          })
                             (?!)
                        )
                   )
              /xg )
    {
        print "Found  $1\n";
    }
    

    输出:

    Found  34
    Found  12
    Found  67
    Found  01
    Found  56
    

    【讨论】:

      【解决方案4】:

      这是在 Perl 中使用正向前瞻断言的一种方法:

      #!/usr/bin/env perl
      
      use strict;
      use warnings;
      
      my $number = "9422512322";
      
      my @matches = $number =~ /(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9))/g;
      
      # We have only matched the first digit of each pair of digits.
      # Add "1" to the first digit to generate the complete pair.
      foreach my $first (@matches) {
        my $pair = $first . ($first + 1);
        print "Found: $pair\n";
      }
      

      输出:

      Found: 12
      Found: 23
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 2019-08-17
        相关资源
        最近更新 更多