0

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

私を悩ませている問題の例。

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だから、誰かが正規表現のマッチングに関するまともなチュートリアルを持っていますか?この試合がどのように行われたかを理解するのを手伝ってください。

4

2 に答える 2

1

これが機能する理由は、これらのパターンが改行で区切られており、デフォルトでは、ドット(.+正規表現の一部)が改行以外のものと一致するためです。その動作を変更するには、RegexOptions.Singlelinesetを使用して正規表現をコンパイルします。

したがって、この貪欲な試合中に中かっこが正しくバランスされたのは偶然の一致です。

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

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

于 2011-08-06T11:01:29.097 に答える
1

これは簡単です... 読む:正規表現の習得 (第 3 版)

これは間違いなく、私が人生で読んだ中で最も役立つ本です。非常に明確で、正確で、エラーのない資料のプレゼンテーション。NFA正規表現エンジンが内部でどのように機能するか、およびこの知識を利用して正確で効率的な正規表現を (ほぼすべての言語で)作成する方法を正確に理解するための、楽しくて完全なチュートリアルです。

正規表現に関して言えば、この本を読んだことのある人と読んでいない人の 2 種類の人がいます。

(表情にすべての.*ドット スターが付いていない人を見つけることができます。)

于 2011-08-06T12:20:24.033 に答える