匹配数字中的增量数字

时间:2014-11-06 20:02:09

标签: regex backreference capturing-group

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

对于号码9422512322,模式(\d)\1将匹配22两次,我希望模式(类似(\d)\1+1)匹配12second digit等于first digit + 1

简而言之,模式应与1223344556等所有匹配项都匹配...没有替代品,只需要匹配。

4 个答案:

答案 0 :(得分:6)

这样的事情怎么样?

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

它没有性感,但它完成了工作。

答案 1 :(得分:1)

您可以使用此正则表达式:

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

这将匹配:

  • 0 s后面的任何1
  • 1 s后面的任何2
  • 2之后的所有3,...

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

以下是regex demo,匹配为:

12345555567877785

答案 2 :(得分:0)

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

PCRE有一些程序变量交互,但不像Perl (注意 - 要执行重叠查找,请将第二个( \d )替换为(?=( \d ))
 然后将print语句更改为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

答案 3 :(得分:0)

以下是使用正向前瞻断言在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