3

perl で正規表現が与えられた場合、その正規表現でキャプチャされたグループの最大数を見つけるにはどうすればよいですか? $1、$2 などを使用して、1 番目、2 番目などのキャプチャされたグループを参照できることがわかっています。しかし、そのようなグループの最大数を見つけるにはどうすればよいでしょうか? キャプチャされたグループとは、括弧内の正規表現によって一致した文字列を意味します。例: 正規表現が (a+)(b+)c+ の場合、文字列「abc」はその正規表現に一致します。そして、最初にキャプチャされたグループは $1 になり、2 番目は $2 になります。

4

3 に答える 3

5

amon%+彼がハッシュについて言及したとき、この質問に対する答えをほのめかしました。しかし、必要なのは@+配列です:

@+

この配列は、現在アクティブなダイナミック スコープで最後に成功したサブマッチの終了位置のオフセットを保持します。$+[0] は、一致全体の末尾の文字列へのオフセットです。これは、突き合わせ対象の変数に対して呼び出されたときに pos 関数が返す値と同じ値です。この配列の n 番目の要素は n 番目のサブマッチのオフセットを保持するため、$+ 1は $1 が終了する位置を超えるオフセット、$+[2] は $2 が終了する位置を超えるオフセット、などとなります。$#+ を使用して、最後に成功した一致にあったサブグループの数を特定できます。@- 変数の例を参照してください。【強調追加

$re = "(.)" x 500;
$str = "a" x 500;
$str =~ /$re/;
print "Num captures is $#+";      #  outputs "Num captures is 500"
于 2013-07-10T23:10:26.963 に答える
0

次のようなコードを使用して、キャプチャ グループの数を取得できます。

$regex = qr/..../; # Some arbitrary regex with capture groups
my @capture = '' =~ /$regex|()/;   # A successful match incorporating the regex 
my $groups_in_my_regex = scalar(@capture) - 1;

これが機能する方法は、成功する必要がある一致を実行してから、作成されたキャプチャ グループの数を確認することです。(余分なものは、末尾のために作成されます|()

編集:実際には、追加のキャプチャ グループを追加する必要はないようです。一致が確実に成功する限り、配列にはすべてのキャプチャ グループのエントリが含まれます。

したがって、2 行目と 3 行目を次のように変更できます。

my @capture = '' =~ /$regex|/;   # A successful match incorporating the regex 
my $groups_in_my_regex = scalar(@capture);

参照:
qr 正規表現でキャプチャ グループを数えますか?

于 2013-07-10T22:56:28.830 に答える