4

この問題について何日もグーグルで調べた後、最終的にこの質問をここに投稿し、ここの専門家によって解決されることを望んでいます。インクリメンタル後方参照に一致する正規表現パターンを探しています。説明させてください:

number9422512322の場合、パターン(\d)\1は2 回一致し、 ( is equal to )に一致22するパターン ( のようなもの) が必要です。(\d)\1+112second digitfirst digit + 1

要するに、パターンは 、 、 、 、 などのすべての出現1223一致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))+.

これは一致します:

  • 0s が後に続く任意の1s、または
  • 1s が後に続く任意の2s、または
  • 2s が続く任意の3s, ...

複数回+、対応する文字に一致します.

ここに正規表現のデモがあり、一致は次のとおりです。

12345 555 5678 77 78 5
于 2014-11-08T16:52:16.667 に答える
0


正規表現の実行フローを制御できる Perl 正規表現内でコードを実行できます。しかし、これは
他のどこにもこの程度実装されそうにありません。

PCRE にはプログラム変数の相互作用がありますが、Perl とは異なります。(注 - 重複検索を行うには、2 番目を
に置き換えてから、 print ステートメントを次のように変更します。( \d )(?=( \d ))
print "Overlap Found $1$3\n";


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 でこれを行う 1 つの方法を次に示します。正の先読みアサーションを使用します。

#!/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 に答える