12

正規表現のクックブックとスタック オーバーフローに関する関連する質問を調べてみましperldoc perlreたが、非常に便利な表現と思われるものを見つけることができないようです。現在の一致の数を知るにはどうすればよいですか?

最後のクローズド グループ マッチ ( $^N)、マッチ 3 の内容 (\g{3}ドキュメントを正しく理解していれば) $'$&およびの表現があり$`ます。しかし、現在の試合の数が何であるかを単純に教えてくれる、使用できる変数はないようです。

それは本当に欠けていますか?もしそうなら、それが実装するのが難しいことである説明された技術的な理由はありますか、それとも perldoc を十分に注意深く読んでいないだけですか?

を使用するような回避策ではなく、組み込み変数に興味があることに注意してください(${$count++})

コンテキストとして、一致の一部のインスタンスのみに一致する正規表現を作成しようとしています (たとえば、文字 "E" のすべての出現に一致しますが、3、7、および 10 の出現には一致しません。3、7、および 10 は単に数字です)。配列で)。この SO questionに対するより慣用的な回答を作成しようとしたときに、これに遭遇しました。

正規表現を文字列として評価して、実際に正規表現自体に 3、7、および 10 を挿入することは避けたいと思います。

4

2 に答える 2

6

これを他の質問に使用することの実際の有用性または知恵を完全に無視しています。

番号付きの一致のオフセットを保持しているので、あなたが望むことを考えた@-、または行うかもしれませんが、正規表現エンジンは最後のインデックスがどうなるかをすでに知っているようです:@+

use v5.14;

use Data::Printer;

$_ = 'abc123abc345abc765abc987abc123';

my @matches = m/
    ([0-9]+)
    (?{ 
        print 'Matched \$' . $#+ . " group with $^N\n";
        say p(@+);
    })
    .*?
    ([0-9]+)
    (?{ 
        print 'Matched \$' . $#+ . " group with $^N\n"; 
        say p(@+);
    })  
    /x;

say "Matches: @matches";

これにより、まだ一致していないにもかかわらず、最後のインデックスが 2 として表示される文字列が得られます$2

Matched \$2 group with 123
[
    [0] 6,
    [1] 6,
    [2] undef
]
Matched \$2 group with 345
[
    [0] 12,
    [1] 6,
    [2] 12
]
Matches: 123 345

最初$+[2]は undef であるため、まだ入力されていないことに注意してください。あなたはそれで何かできるかもしれませんが、それはおそらくあなたの質問の精神から離れていると思います. あなたが本当に好きなら、 で最後に定義されたインデックスの値を持つ tie スカラーを作成できる@+と思います。

于 2012-08-12T00:25:42.427 に答える
5

私はこれで少し遊んだ。繰り返しますが、これが実際にあなたが探しているものではないことはわかっていますが、それがあなたの望む形で存在するとは思いません。

二つの思いがありました。まず、区切り保持モードを使用した分割では、インタースティシャル ビットが出力リストの奇数番号の要素として取得されます。splitのリストを使用して、どの試合に参加しているかを数え、好きなように元に戻します。

use v5.14;

$_ = 'ab1cdef2gh3ij4k5lmn6op7qr8stu9vw10xyz';

my @bits = split /(\d+)/; # separator retention mode

my @skips = qw(3 7 10);
my $s;
while( my( $index, $value ) = each @bits ) {
    # shift indices to match number ( index = 2 n - 1 )
    if( $index % 2 and ! ( ( $index + 1 )/2 ~~ @skips ) ) {
        $s .= '^';
        }
    else {
        $s .= $value;
        }
    }

私は得る:

ab^cdef^gh3ij^k^lmn^op7qr^stu^vw10xyz

もう一度考え直すまで、分割回答が本当に好きだと思っていました。状態は置換内で機能しますか? それはそうであるようです:

use v5.14;
$_ = 'ab1cdef2gh3ij4k5lmn6op7qr8stu9vw10xyz';
my @skips = qw(3 7 10);

s/(\d+)/
    state $n = 0;
    $n++;
    $n ~~ @skips ? $1 : '$'
    /eg;

say;

これは私に与えます:

    ab$cdef$gh3ij$k$lmn$op7qr$stu$vw10xyz

その魔法の変数が存在したとしても、それよりもはるかに単純になるとは思いません。

私は試みなかった第三の考えを持っていました。コード アサーション内で状態が機能するのだろうか。そうかもしれませんが、その場合、それらの 1 つを使用して一致を失敗させる方法を理解する必要があります。つまり、一致した可能性のあるビットをスキップする必要があります。これは非常に複雑に思えますが、これはおそらくボロディンが疑似コードで表示するように圧力をかけていたことです。

于 2012-08-13T11:39:20.450 に答える