2011-12-14 13 views
0

私はわたってるしき行くことができ正規表現マッチテキスト:[[テキスト]]

[[text is here]] 

ほとんど何のライン上で何かにマッチするC#で働くだろう正規表現を記述しようとしています[[および]]

唯一の規則は、[または]が表示された場合、 が1行になることはありません。例えば

[[ text ] is here ]] is a match 
[[ text [ is ]here [ ]] is a match 
[[ text ][ is [] ]] is a match 

[[ text [[ is here]] is NOT a match. 

私は時間のために私の頭を悩まてきたし、私が作ってみた最も近い

@"\[\[[^\[]+(\]\])+?" 

上記

[[text is ] here]] 

but not 

[[text is [ here]] 

一致しますですどのような助けや洞察力にも感謝します。

+1

正規表現がここでマスタードをカットしようとしていますが、単純なパーサーは簡単に書くことができます。 –

+1

私はマットに同意します。ディッチレグエックスがここにあります。それはかなり複雑になるでしょうし、あなたはそれを変更したいときはいつも、あなたの頭を新たに包み込む必要があります。文字列の各文字をループする単純なforループは、理解しやすく、変更しやすく、計算がはるかに高速です。 – jmacinnes

答えて

2
\[\[(?:[^\[\]]|\][^\]]|\[[^[])*\]\] 

が拡大:これは[[ is here]][[ text [[ is here]] is NOT a match.に一致すること

\[\[   # match the [[ 
(?:   # and then match zero or more... 
    [^\[\]]  # character which is not [ or ], or 
| \][^\]]  # a ], followed by a non-], or 
| \[[^[]  # a [, followed by a non-[ 
)* 
\]\]   # and match the ]] 

注意を。

+0

これは、文字列 "[[text is [here here]]"に対する部分一致を返します。これは、要件に応じて一致してはなりません。文字列「[[ここに]]」が一致しています。 – jmacinnes

+1

@jmacinnes:完全なマッチが必要な場合は、 '^ ... $'を正規表現に貼り付けてください。 – kennytm

+0

これは間違いなく動作しますが、一致するテキストが他のテキストに埋め込まれていないと仮定しますが、これは質問で確認も拒否もされません。 – jmacinnes

0

私があなたの質問を正しく理解していれば、[[ ]]部品のテストと、2つの連続した「不良」条件の2つの正規表現に分割する必要があります。 「一致」は、第1のものと一致し、第2のものとは一致しない。

EDITまたは使用あなたが先に正の外観を必要と背後になります

0

KennyTMの優れたソリューション。

(?<=\[\[).*?(?=\]\])