1

再帰的な Perl 正規表現を使用して、ネストされた singlechar ブラケットをスキャンします。

$RE =     qr'(?:[\(]((?:(?>[^\(\)]+)|(??{$RE}))*)[\)])';

これにより、次のような c 関数呼び出しをスキャンできます。

"func (a(b()))" ~= /$RE/

"(a(b()))" に一致します。ここで、パスカル スタイルのネストされた [if,if-end] ブラケットを解析したいと思います。

if (a) then
   if (b) then
     blaif := 1;
   else 
     blaend := 2;
   end if;
end if;

上記の $RE を次のように書き換えようとしました。

$RE_if  =  qr'(?:(?:if)((?:(?>(?!(?:\bif\b|\bend\s+if))+)|(??{$RE_if}))*)\
(?:\bend\s+if))';

しかし、それはちょっとうまくいきません。["if","end if"] のような複数文字の括弧を処理する正規表現を誰かが持っていますか?

-- こんにちはコンラッド

4

1 に答える 1

1

元のパターンを見てみましょう: (余分なエスケープが削除されました。不要な周囲が(?:)削除されました。)

[(]                  # Prefix.
(
   (?: (?> [^()] +)  # Some characters containing neither prefix nor suffix.
   |   (??{ $RE })   # Recursion
   )*
)
[)]                  # Suffix.

(?:(?!STRING).)*STRINGそのまま[^CHAR]*CHAR、次のようになります。

\bif\b
(
   (?: (?> (?:(?! \b(?:end\s+)?if\b ).)+ )
   |   (??{ $RE })
   )*
)
\bend\s+if\b

ちなみに、(?>PAT+)と書けるPAT++

于 2013-06-02T22:08:51.900 に答える