1

ブレインファック コード内のすべてのループを取得できる正規表現を作成したいと思います。

このコードが与えられたとしましょう:

++++[>+[>,++.]<<-]++[>,.<-]

これら 3 つのループを取得したい (実際には、最初のループを取得するだけで十分です)。

[>+[>,++.]<<-]
[>,++.]
[,.<-]

私の正規表現の知識はかなり貧弱なので、基本的なことしかできません。私が考えたのは、次の表現です。

\[[-+><.,\[\]]*]

\[            - Match the first (opening) bracket
[-+><.,\[\]]* - followed by a number of brainfuck operators
]             - followed by a closing bracket

ただし、これは(明らかに)最初の開始ブラケットと最後の終了ブラケットの間のすべてに一致します。

[>+[>,++.]<<-]++[>,.<-]

最後の閉じ括弧に一致する前に、ループ内の同じ数の開き括弧と閉じ括弧をテストする必要がある場合があります-それが理にかなっている場合。

たぶん、ルックアラウンド(javascriptでこれを使用する必要があるため、lookaheadsしか使用できません)がこれを行う正しい方法ですが、どのように行うべきかわかりません。

4

3 に答える 3

1

角括弧のペアを一致させる必要があるときに、これを一度書きました(ネストを正しく処理している間)

これは、すべての正規表現エンジンでは利用できないいくつかの機能を使用する .NET 正規表現です。ここに行きます:

\[(?>\[(?<d>)|\](?<-d>)|.?)*(?(d)(?!))\]
于 2014-07-10T12:03:47.880 に答える
0

非貪欲 (または遅延) マッチングを使用します。

\[[-+><.,\[\]]*?\]

に注意して?ください。[ただし、との間の最短の文字列に一致します]。したがって、結果の 1 つは次のようになります。

[>+[>,++.]
于 2014-07-09T12:02:55.430 に答える