2

少し例を挙げてみましょう。次のテキストがあります。

[[ いくつかのタグ [[ ネストされたタグ付き ]] と再び ]]

[[ with tag nested ]]に一致させたいのですが、 [[ some tag [[ with tag nested ]]には一致させません。単純

\[\[(?<content>.+?)\]\]

明らかにうまくいきませんでした。だから私は正規表現を作成しました:

\[\[(?!.*?\[\[.*?\]\].*?)(?<content>.+?)\]\]

残念ながら、C# を使用すると (MatchOptions.SingleLine を使用して) 何にも一致しませんが、PHP の preg_match は完全に機能します。

手がかり/アイデアはありますか?どんな助けでも大歓迎です。

4

2 に答える 2

3

これは有効な一致ですか?

[[ with [ single ] brackets ]]

そうでない場合、この正規表現は次のことを行う必要があります。

 \[\[(?<content>[^][]*)\]\]

[^][][またはではない任意の文字に一致します]。中括弧1つだけ許可されている場合は、次のことを試してください。

\[\[(?<content>(?:(?!\[\[|\]\]).)*)\]\]

(?!\[\[|\]\]).[[任意の文字に一致しますが、それがまたは]]シーケンスの先頭ではないことを確認した後でのみです。

于 2011-01-21T02:25:50.380 に答える
3

最も内側のブラケットの 1 つだけを見つけるために私が知っている最も簡単な方法は次のとおりです。

var match = Regex.Match(input, @"^.*(\[\[(.*?)\]\])", RegexOptions.Singleline);

これが機能するのは、最後 の. もちろん、これは整形式であることを前提としています。開始/終了ブラケットが適切に一致しない文字列がある場合、これは失敗する可能性があります。[[[[]]

最も内側のブラケットを見つけたら、入力文字列から削除できます。

input = input.Remove(match.Groups[1].Index, match.Groups[1].Length);

次に、正規表現が一致しなくなるまで、while ループでプロセスを繰り返します。

于 2011-01-21T02:44:31.267 に答える