2011-01-21 19 views
2

少しの例から始めましょう。私は、次のテキストがあります。ネストされたタグのC#regexp

[[一部のタグは、[[タグと]]と再び]ネストされた]を、私は[[タグ付き]ネストされた]と一致したいのですがではなく、 [[いくつかのタグ[[入れ子にタグをつけた]]。単純

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

明らかに動作しませんでした。だから私は、正規表現を作成しました:PHPのするpreg_matchは完璧に動作しながら、

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

残念ながら、それは、(MatchOptions.SingleLine付き)C#を使用して、何も一致していません。

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

+0

C#で正規表現を使用して正規表現を実行しても問題はありません。 [[タグ付き]]を正しく返します。コードを投稿できますか? –

+0

私は問題があるかどうかはわかりません。私はあなたの2番目のパターンと 'RegexOptions.Singleline'を使って' System.Text.RegularExpressions.Regex'を作成し、次にあなたのサンプル文字列に 'Match'を呼び出しました。それは "[[入れ子になった]]"の1回のキャプチャで戻ってきました。 –

+0

@ハリー:この入力で試してください: '[[outer1 [[nested1]] outer2 [[nested2]] outer3]]'。質問を正しく理解すると、 'nested1'と' nested2'と一致するはずですが、 'nested2'にしかマッチしません。 –

答えて

3

最も簡単な方法はこれです:それは見つかったので、これは動作します

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

最後[[(それの後[[これ以上はありませんしたがって、ネストされたタグを含めることはできません)、その後すぐに続く]]の順になります。もちろん、これは整形式を前提としています。開始/終了括弧が正しく一致しない文字列がある場合、これは失敗する可能性があります。

あなたが最も内側のブラケットを見つけたら、入力文字列から削除することができます:

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

、その後、正規表現がもはや一致するまで、whileループでプロセスを繰り返しません。

+0

これは私が(そしておそらく)望んでいたものを生み出すのではないかと恐れています。それは最初の[[。 とにかく、お返事ありがとうございます。 – FoxException

+0

@Avaer:いいえ、そうではありません。それはうまく動作します。あなたはそれを試しましたか?失敗したと思われる場合は、失敗した入力例を入力してください。 – Timwi

+0

私はあなたに謝罪しなければならない、私はグループ[1]の内容を観察しなかったが、ただちにバリューをチェックした。それは動作します。再度、感謝します。 – FoxException

3

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

[[ with [ single ] brackets ]] 

ない場合は、この正規表現は実行する必要があります。

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

[^][][]ない任意の文字に一致します。

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

(?!\[\[|\]\]).は任意の文字に一致しますが、唯一の確認した後、それは[[または]]シーケンスの開始ではありません:シングルかっこがが許可されている場合は、これを試してみてください。最も内側のブラケットの一つだけを見つけるために私の知っている

+0

これは正常に動作します。ありがとうございました! – FoxException

+0

@Avaer:それは私のことで、私のことはもっと簡単です。 – Timwi

+0

@ティムウィ、私はアランの提案を好む。おそらくあなたの正規表現はより短いという意味では単純ですが、最初の '。*'は行全体を消費し、最後の '[' 'にはバックトラックするのは直感的ではないためです。その上、あなたの命題は 'aaa [[bbb ccc]] [[ddd']のようなケースを扱いません。 –

関連する問題