ruby-reference-manual:2691
From: Yui NARUSE <redmine@r...>
Date: Fri, 3 Jun 2011 00:15:42 +0900
Subject: [ruby-reference-manual:2691] [るりまプロジェクト - Bug #4816] 正規表現の (?! )
Issue #4816 has been updated by Yui NARUSE. 5 5 wrote: > 正規表現の否定先読みの説明において, > > (?!re1)re2 という表現は、re1 にマッチしないが re2 にはマッチする正規表現です。 > > とありますが,正規表現が正規表現にマッチする/しないというのは言葉の上で変です。 確かにおかしいですね。 > おそらく文の意図は,「《re1 にはマッチしないが re2 にはマッチする文字列》にマッチする正規表現」なのだろうと思います。 > しかし,これは誤りです。以下の単純な例がそれを示します。 > > /(?!a)ab/=~"ab" > > この例で,"ab" は,《/a/ にはマッチしないが /ab/ にはマッチする》文字列になっていますが,/(?!a)ab/ にはマッチしません。 > > ※ここらへんを正確に伝えるために,「マッチする」と「部分マッチする」を区別する必要があります。 > > 否定先読みは位置指定なのに,位置の概念を用いずに表現しようとするから誤ってしまうのだと思います。 > > 結局,(?!re1)re2 は, > > re1 にマッチしない位置から始まり,re2 にマッチする文字列のパターンを表す正規表現です。 > > と書くべきではないでしょうか。 位置が重要というのは仰るとおりです。 ただ、これって「サーバ」の例もそうですけど、re2 の部分不要ですよね。 先読みは\A\z^$などのように、幅がゼロのアサーションととらえるべきでしょう。 > そして,否定先読みの最も理解しやすい例として,長音符号(ー)の付かない「サーバ」を検索する以下のようなものをまず挙げるのがいいんじゃないでしょうか。 > > "サーバもサーバーもサーバ".scan(/サーバ(?!ー)/).size # => 2 これはいい例なんじゃないかと思います。 ---------------------------------------- Bug #4816: 正規表現の (?! ) http://redmine.ruby-lang.org/issues/4816 Author: 5 5 Status: Open Priority: Low Assignee: Category: doc Target version: reporter: ruby_version: =begin 正規表現の否定先読みの説明において, (?!re1)re2 という表現は、re1 にマッチしないが re2 にはマッチする正規表現です。 とありますが,正規表現が正規表現にマッチする/しないというのは言葉の上で変です。 おそらく文の意図は,「《re1 にはマッチしないが re2 にはマッチする文字列》にマッチする正規表現」なのだろうと思います。 しかし,これは誤りです。以下の単純な例がそれを示します。 /(?!a)ab/=~"ab" この例で,"ab" は,《/a/ にはマッチしないが /ab/ にはマッチする》文字列になっていますが,/(?!a)ab/ にはマッチしません。 ※ここらへんを正確に伝えるために,「マッチする」と「部分マッチする」を区別する必要があります。 否定先読みは位置指定なのに,位置の概念を用いずに表現しようとするから誤ってしまうのだと思います。 結局,(?!re1)re2 は, re1 にマッチしない位置から始まり,re2 にマッチする文字列のパターンを表す正規表現です。 と書くべきではないでしょうか。 そして,否定先読みの最も理解しやすい例として,長音符号(ー)の付かない「サーバ」を検索する以下のようなものをまず挙げるのがいいんじゃないでしょうか。 "サーバもサーバーもサーバ".scan(/サーバ(?!ー)/).size # => 2 =end -- http://redmine.ruby-lang.org -- ML: ruby-reference-manual@m... Info: http://QuickML.com/
2688 2011-06-02 14:24 [redmine@r... ] [るりまプロジェクト - Bug #4816][Open] 正規表現の (?! ) -> 2691 2011-06-02 17:15 ┗[redmine@r... ] [るりまプロジェクト - Bug #4816] 正規表現の (?! )