2011-08-06 10 views
0

私は何年もregexを使ってきましたが、いくつかのチュートリアルとリファレンスを読んでいます(emacs regexのリファレンスは私の聖書です)。豊富な例との正規表現マッチングについての包括的なチュートリアルはありますか?誰も私に最終的に正規表現のマッチングを深く理解できるリンクを私に与えることはできますか?regex matchingチュートリアル

問題は私を悩ませています。

haystack = "[{one, {one, andahalf}},\n {{two, zero}, two},\n {{threezero}, three},\n {four}]" 
pattern = "({.+})" 

結果は次のとおりです。今

{one, {one, andahalf}} 
{{two, zero}, two} 
{{threezero}, three} 
{four} 

、正確ということは何ですか?欲張りでも無条件でも(C#Regexp.Matches)?

なぜ、(最短一致)結果ではない理由O:

又は(欲張り)({}の最初可能ペアマッチング)

{one, {one, andahalf} 
{{two, zero} 
{{threezero} 
{four} 

{one, {one, andahalf}},\n {{two, zero}, two},\n {{threezero}, three},\n {four} 

を(機械加工可能な最大のペア{})

実際の結果はまさに私が必要とするものであり、私は非常に満足していますその正規表現は私の心を読み取るが、私はむしろ私は彼の心を読んでいると思う:-Dだから、誰かがこの正規表現の仕組みがどのようになったのか理解するのに役立つ正規表現のマッチングについてのまともなチュートリアルを持っているのだろうか?

答えて

1

これらのパターンは改行で区切られており、デフォルトで正規表現の.+部分のドットは改行以外のものと一致します。その動作を変更するには、正規表現をRegexOptions.Singlelineに設定してコンパイルします。

この欲張りの試合では、中括弧が正しくバランスされていたのは間違いありません。

良い正規表現のチュートリアルはhttp://www.regular-expressions.infoにあります。

ところで、安全のため、中かっこは常にエスケープする必要があります(\{\})。 .NET正規表現エンジンは、このコンテキストでは数量化を意味するものではないことを認識しますが、他のエンジンはこの正規表現をコンパイルできません。

+0

ああ、改行。右。ありがとう!愚かな私。そして、逃げる先端のおかげで。 – dijxtra

1

これは簡単なものである...続きを読む:Mastering Regular Expressions (3rd Edition)

これは、私は私の人生の中で読んだ最も有用な書籍ダウンの手です。材料の非常に明確で、正確で誤りのない提示。 NFA正規表現エンジンが正確にどのように動作するかを深く理解し、この知識を利用して正確な効率的な正規表現を作成するための入門編です。

正規表現に関しては、この本を読んだ人と読まなかった人の2種類があります。

(あなたは自分の表現のすべての.*ドット-星ではない持っているものを見つけることができます。)

+0

ありがとう、その本は素晴らしいです!私はそれを買っていると確信している、ありがとう。 – dijxtra