|
分類:[.NET 全般]
正規表現の学習をしているのですが、理解が及ばない点があるので教えてください。 「肯定先読み(?=)」と「否定先読み(?!)」で躓いています。
お題として、「A1」と「1A」という2つの文字で考えます。
(1)最初に「文字全体」を先読みで「数字」+「数字以外」かチェック。(「1A」のみ合格) (2)↑に成功すれば「数字」を取り出す。
本来、「肯定:\d+(?=[^\d]+)」や「否定:\d+(?!\d+)」でいいと思いますが、最初に「文字全体」をチェックして これに合格しないと、「その時点でマッチなし」という表現を考えています。
現在の私の理解を日本語で書きます。
●「肯定先読み(?=)」の場合:(?=^\d+[^\d]+$)\d
(1)(?=^\d+[^\d]+$)で「対象文字列全体」が 「数字」+「数字以外」かチェック (2)↑で「A1」は、はじかれ「1A」のみが対象 (3)続く「\d」で「1A」の「1」のみ得られる。
こちらは、想定通りです。
●「否定先読み(?!)」の場合:(?!^[^\d]+\d+$)\d の場合の理解が及びません。
(1)(?!^[^\d]+\d+$)で「対象文字列全体」が NOT(「数字以外」+「数字」)かチェック (2)↑で「A1」は、はじかれ「1A」のみが対象 (3)続く「\d」で「1A」の「1」のみ得られる。
しかし、結果は「A1」「1A」共、マッチします。 先読みが「位置」にマッチするという事は理解しております。 「A1」の場合、「(?!^[^\d]+\d+$)」がマッチなしで、パーサが先頭位置のままで、続く「\d」で「1」を 拾っているのだと思いますが、この理解だと「肯定先読み」の(?=^\d+[^\d]+$)が説明つきません。
私の理解の間違っている点を、教えてもらえないでしょうか?
|