1

関数名とコロンで始まるネストされた Wiki 関数または Wiki パーサー関数を一致させたいのですが、第 1 レベルのテストで再帰的な pcre 正規表現を機能させようとすると、正規表現パターンの作成に失敗します。{{aFunctionName:最初にコロンが続くテストと一致させたいのですが、正規表現{{[\w\d]+:ではテストテキストは次のようになります

1 {{DEFAULTSORT: shall be matched {{PAGENAME}} }}
2 {{DEFAULTSORT: shall be matched }}
3 {{DEFAULTSORT: shall be matched {{PAGENAMEE: some text}} }}
4 Lorem ipsum {{VARIABLE shall not be matched}}
5 {{Some template|param={{VARIABLE}} shall not be matched }}

私はできる

  • ネストされた中括弧を取得する{{(?:(?:(?!{{|}}).)++|(?R))*}}
    には、行 1、2、3、部分的に 4 および 5 を取得します
  • ネストされた wiki 関数を取得するに({{(?:[\w\d]+:)(?:(?:(?!{{|}}).)++|(?1))*}})
    は、3 行目のみを取得しますが、1 行目と 2 行目も一致させたいと考えています。

しかし、(疑似コードとして書かれた)次のようなものをテストする正規表現パターンを構築する方法がわかりません:

{{match1st-level-Function: then anything {{nested}} or not nested }}
{{do not match simple {{nested}} things}}

pcre正規表現の専門家からの助けはありますか? ありがとうございました!

4

1 に答える 1

2

次のようなものを使用します。

{{\w+:([^{}]*+(?:{{(?1)}}[^{}]*)*+)}}

再帰パターンを取得するために、 の使用は(?R)必須ではありません。番号、相対位置(現在の位置から)、または名前(名前付きキャプチャを使用する場合) を使用して、以前に開いたキャプチャ グループを参照することもできます。

他の可能な構文は次のとおりです。

{{\w+:([^{}]*+(?:{{(?-1)}}[^{}]*)*+)}}
#                    ^------ relative reference: the last group on the left

{{\w+:([^{}]*+(?:{{\g<1>}}[^{}]*)*+)}}
#                  ^----- oniguruma syntax

{{\w+:([^{}]*+(?:{{\g<-1>}}[^{}]*)*+)}}
#                  ^----- relative with oniguruma syntax

{{\w+:(?<name>[^{}]*+(?:{{\g<name>}}[^{}]*)*+)}}
#                         ^---- named capture (oniguruma)

{{\w+:(?<name>[^{}]*+(?:{{(?&name)}}[^{}]*)*+)}}
#                         ^---- named capture (perl syntax)

これらの構文はすべて pcre で使用できます。

再帰にパターン全体を絶対に使用したい場合は、最終的に条件ステートメントを使用して、ネストされた部分にいるかどうかをテストできます。

{{(?(R)|\w+:)[^{}]*+(?:(?R)[^{}]*)*+}}

条件は次の(?(R)|\w+:)スキーマに従います。(?(condition) True | False)

于 2016-05-19T19:54:12.803 に答える