1

ヒアドキュメントに類似した構文の構文強調表示を実現しようとしています。したがって、開始名を取得する必要があります。しかし、私は失敗しました(ルールとスパンで試してみました)。これは私の正規表現です:

(?:([A-Z]{3,}))(.|\n)*?\1

正規表現は正規表現テスターで機能します。

しかし、XSHD-Definition に入れると、エラーが発生します。

Error at line 128:
"(?:([A-Z]{3,}))(.|\n)*?\1" wird analysiert - Verweis auf die nicht definierte Gruppenzahl 1.

グループ番号 1 が定義されていないと表示されます。

誰かが理由を知っていますか?マッチングを実現する方法は?

ありがとうございました

4

3 に答える 3

2

AvalonEditはを使用しRegexOptions.ExplicitCaptureているため、名前付きキャプチャグループを使用する必要があります。

ただし、AvalonEditでは実行しようとしていることはできません。ルールを複数行にすることはできません。また、スパンエンドはスパン開始へのバックリファレンスを使用できません。

これは、強調表示エンジンが各行を個別に強調表示し、ユーザーがテキストを編集しているときにのみ変更された行を再強調表示するためです。HEREDOC構造をサポートするには、AvalonEditは、名前付きキャプチャグループの結果をスパンスタックの一部として格納する必要があり、スパンエンド正規表現がそれらの格納された結果への後方参照を使用できるように、いくつかの特別な構文をサポートする必要があります。

于 2011-12-15T10:03:56.003 に答える
1
"(?:([A-Z]{3,}))(.|\n)*?\1"

うーん、最初の括弧 (?: ) は非キャプチャ グループです。グループ化したい場合 (たとえば | 演算子の場合) ですが、それを「記憶」する必要はありません。2 番目の括弧 (グループ #1 にしたいもの) は、その中にあります: ([A-Z]{3,}). 「この中に何が入っているか覚えていない」と言うことで、覚えていないのは当然のことのように思えます。

とにかく、外側がキャプチャされていない、2 倍になったグループのポイントは何ですか? (量指定子シーケンスの 2 番目の部分を指定しない場合も、コンマは必要ありません) 次のように言えますか?

"([A-Z]{3})[.\n]*?\1"   //now \1 is defined?

グループ化 + 代替 + 量指定子を一度に使用した3 番目のグループ に関して(.|\n)*?は、元の式でアクセスしようとした場合に \3 が何であるかはわかりません[.\n]*?

于 2011-12-14T18:15:22.533 に答える
0

*?

後方参照自体を繰り返します。

どうですか

(?:([AZ]{3,}))[.\n]*?\1

于 2011-12-14T16:23:27.580 に答える