4

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

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

简而言之,模式应该匹配所有出现的情况,如12, 23, 34, 45, 56, 等......没有替换,只需要匹配。

4

4 回答 4

6

这样的事情呢?

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

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

于 2014-11-06T20:05:02.910 回答
1

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

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

这将匹配:

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

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

这是一个正则表达式演示,匹配是:

12345 555 5678 77 78 5
于 2014-11-08T16:52:16.667 回答
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
于 2014-11-06T22:11:36.480 回答
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
于 2014-11-07T01:17:12.600 回答