正規表現のperl互換 \w \s \d などについNo.04604
秀丸担当 さん 09/11/27 17:38
 

HmJre.dllの \w がperlの正規表現と違うという件と、\s \d などの対応をV8.00
のタイミングでしたほうがいいのではないかと話が上がっています。

具体的には、\wと[^x]の変更と、\W \s \S \d \D の追加を検討しています。

  \w 数字も含んだ英単語 [a-zA-Z_0-9]と同じ
  \W それ以外 [^a-zA-Z_0-9]と同じ
  \s 空白 [ \t]と同じ
  \S 空白以外 [^ \t]と同じ
  \d 数字 [0-9]
  \D 数字以外  [^0-9]
  [^x] は、現状で改行にマッチするけど、マッチしないように変更

\sはperlでは [ \t\n] ということのようですが、[ \t]のほうが都合がよさそう
ということで検討中です。

しかし変更点については互換性が失われてしまうので、そのあたりの扱いをどう
したらいいか考えています。
もし何かご意見ありましたらコメントしていただけると助かります。


●互換維持する案
・秀丸エディタの[動作環境]→[トラブル対策]→[その他トラブル対策]のところ
に互換性設定を付ける。
 (あいまい検索の設定からも操作できたらいいかも)

・デフォルトで旧モード。

・検索ダイアログからの検索は互換性設定に従う。

・マクロは原則旧モードで、setcompatiblemodeで新モードの指定ができるよう 
に。

・強調表示などの設定は、互換性設定に関わらず旧モードのまま。
 (そうじゃないと既存の設定や、既存の強調表示定義ファイルなどで互換がと
れない)

・旧モードであっても正規表現パターンに"(?#perl)"を付けて記述するとperl互
換にできるように。

ということにすると概ねいいような気がしますが、強調表示が旧モードのままだ
と中途半端かもしれません。


●デフォルトで新モード案
だいたい上記の通りで、影響無いと信じて

・デフォルト新モード
・強調表示などの設定でも新モード

にしてしまう。


●影響少ない案
\s \S \d \D だけに追加対応。
互換性設定は無し。


●以前にコメントされていた案

  hidesoft.2:21851| RE 21844 正規表現における単語文字
  http://hidemaruo.dip.jp:81/hidesoft/hidesoft_2/x21824.html#21824

[ ]
RE:04604 正規表現のperl互換 \w \s \d なNo.04605
Iranoan さん 09/11/27 18:01
 
 秀丸担当さん今日は、Iranoan です。
 私は、概ね
> ●互換維持する案
に賛成。ただ
> 強調表示が旧モードのままだ
> と中途半端かもしれません。
が気になります。
・「強調表示」「複数行コメント」「アウトライン」でそれぞれ互換性設定を
  授ける
  →繁雑だし、却って混乱の元かも
・検索の互換性設定と同期するようにしつつ、設定を変更した時は、
  ------------------------------------------------------------
  o 強調表示
  o 複数行コメント
  o アウトライン
  にも適用されます。
  ------------------------------------------------------------
  と警告を出す。
としたほうが良い気がします。

> ●デフォルトで新モード案
 \w は結構使っている気がします。

> ●影響少ない案
> \s \S \d \D だけに追加対応。
 こちらにも賛成したいほど、殆どは大丈夫だと思います。ただやはり、僅か
ながらあるでしょうね。

[ ]
RE:04605 正規表現のperl互換 \w \s \d なNo.04606
Iranoan さん 09/11/27 18:25
 
 秀丸担当さん今日は、Iranoan です。
> > ●影響少ない案
> > \s \S \d \D だけに追加対応。
>  こちらにも賛成したいほど、殆どは大丈夫だと思います。ただやはり、僅か
> ながらあるでしょうね。
に付いてですが、私の指摘よりむしろ、殆ど同じものが使えるのに \W は無く、
\w は仕様が異なるという中途半端な取り込みは、Perl ユーザは却って混乱す
る方が問題かもしれません。

[ ]
RE:04604 正規表現のperl互換 \w \s \d なNo.04609
IKKI さん 09/11/28 02:08
 
こんにちは。IKKI です。

> ●デフォルトで新モード案
私はこれに賛成します。

中途半端が一番よくないです。
Perl の下位互換にするならするで、旧来のしがらみを徹底的に排除し、新規ユー
ザーに歴史的経緯を意識させないようにするべきだと思います。

以下、私案です。

▼検索ダイアログ
デフォルトで新モード。
[動作環境]-[検索]-[検索ダイアログ] または [動作環境]-[トラブル対策]-[その他
トラブル対策] で旧モードを選択可能。(このオプションは検索ダイアログにしか影
響しない)

▼コマンドラインの /s, /g オプション
新モード固定。
もし問題が出たら [動作環境]-[トラブル対策]-[その他トラブル対策] で旧モードを
選択可能に。

▼強調表示
秀丸エディタ内では新モード固定。
hilight ファイルはデフォルトで旧形式。何らかの宣言文で新形式に切替可能。
旧形式の hilight ファイルは読み込む時点で新モードに変換する。
hilight ファイルへの書き出しは新形式固定。

 hilight ファイル (旧形式)
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

┃57,hoge-\w-fuga

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ↓読み込みと同時に変換
┌─────────────────────────────

│hoge-[a-zA-Z_]+-fuga 正規表現,単語 強調1

└─────────────────────────────
 ↓書き出し (新形式)
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃/<RegexVersion>
┃/HMJRE 3.00

┃57,hoge-[a-zA-Z_]+-fuga

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

この方式だと v7 以前からのバージョンアップ時の対応が少々面倒かもしれませんが、
将来に禍根を残さないという意味では最善手かと思います。

▼マクロ
デフォルトで旧モード。
setcompatiblemode で新モードに切替可能。
loaddll "HMJRE.dll"; の場合は新モード固定。(または後述のように DLL ファイル
名でモード切替)

> ●以前にコメントされていた案
>
>   hidesoft.2:21851| RE 21844 正規表現における単語文字
>   http://hidemaruo.dip.jp:81/hidesoft/hidesoft_2/x21824.html#21824

DLL のファイル名で動作モードを明示するのはいいアイディアかもしれません。
# 正規表現内にいちいち "(?#perl)" とか書きたくないし。 ←本音

 loaddll "HMJRE.dll"; // 旧モード
 loaddll "HMJRE3.dll"; // 新モード

もっとも、HMJRE を loaddll するようなマクロの作者は新モードにもすぐ対応して
くれるんじゃないかと思いますけど。

[ ]
RE:04609 正規表現のperl互換 \w \s \d なNo.04610
IKKI さん 09/11/28 02:27
 
補足です。

> Perl の下位互換にするならするで、旧来のしがらみを徹底的に排除し、新規ユー
> ザーに歴史的経緯を意識させないようにするべきだと思います。

この観点から言うと \< \> も廃止して \b \B を導入した方がいいと思います。

\< \> と \b は意味が違いますが、機械的に置き換えてしまっても事実上問題ない気
がします。
# この違いが問題になるほど技巧的な定義って流通してるでしょうか?

 hilight ファイル (旧形式)
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

┃17,\<hoge-\w-fuga\>

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ↓読み込みと同時に変換
┌─────────────────────────────

│\bhoge-[a-zA-Z_]+-fuga\b 正規表現 強調1

└─────────────────────────────
 ↓書き出し (新形式)
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃/<RegexVersion>
┃/HMJRE 3.00

┃17,\bhoge-[a-zA-Z_]+-fuga\b

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[ ]
RE:04604 正規表現のperl互換 \w \s \dなNo.04611
h-tom さん 09/11/28 13:27
 

h-tom です。

>●デフォルトで新モード案
せっかく変更するなら、こちらがいいです。

>  [^x] は、現状で改行にマッチするけど、マッチしないように変更
これは、何故なんでしょうか?
確かに、躓きやすい所ではありますが、自分が指定した文字以外も対象になる事に、
違和感を感じます。


余談
ここまで仕様を変えるなら、いっそのこと、変換モジュールと同じく、ワイド文字
で、HMJRE.DLLとのI/F作り直すとか。(Ver.9を目標)
jre32.dllをサポートする都合上、難しいでしょうけど、BregIf.dllのように、
ラッパーDLLを経由する方法もありますし。

[ ]
RE:04604 正規表現のperl互換 \w \s \d なNo.04613
colder さん 09/11/28 17:34
 
>\sはperlでは [ \t\n] ということのようですが、[ \t]のほうが都合がよさそう
>ということで検討中です。

perl では改ページ(\x0c)も含みます。
perl 以外だと垂直タブ(\x0b)も含む方が一般的です。

>・旧モードであっても正規表現パターンに"(?#perl)"を付けて記述するとperl互
>換にできるように。

\s、\S、\d、\D、\w、\W 以外にも perl と非互換なところが多くあり、(?#perl)は
やめておいた方がいいです。


\S、\D、\W などのバックスラッシュ+大文字のメタ文字を導入する場合、
大文字小文字を区別しない場合、内部的に小文字に変換するのをやめないと、
全く異なるものが検索されることになります。
(現在でも、大文字小文字区別なしで[@-D]などと指定した場合、検索される文字が異
なります)


[ ]
RE:04610 正規表現のperl互換 \w \s \d なNo.04614
colder さん 09/11/28 17:44
 
>\< \> と \b は意味が違いますが、機械的に置き換えてしまっても事実上問題ない
>気がします。
># この違いが問題になるほど技巧的な定義って流通してるでしょうか?

それなりに多いと思います。
少なくとも、単語の先頭文字にマッチさせたい場合、
\<[A-Za-z_] と書くより \<. と書いた方が楽です。

>旧形式の hilight ファイルは読み込む時点で新モードに変換する。

変換後の文字列の長さが伸びると、強調できる限界近い長さの定義がある場合、
後半部分が削除され、強調定義が不正なものになる可能性が高いです。

[ ]
RE:04614 正規表現のperl互換 \w \s \d なNo.04615
IKKI さん 09/11/28 20:55
 
こんにちは。IKKI です。

> > 事実上問題ない気がします。
> それなりに多いと思います。
データがないと議論になりませんね。(^^;

秀丸エディタの強調表示定義ファイルライブラリで今日現在公開されているものを全
部調べてみました (アーカイブ 152 個、hilight ファイル 168 個)。
見つかったすべての定義を以下に示します。正規表現でない定義は除いてあります。
○は適切な定義、×は不適切または無意味な定義です。

▼\w を含む定義
○ Curl.hilight(2): 17,: *#*\w
○ BeDpmk.hilight(36): 209,^ *\.\w
× Delphi.hilight(98): 153,[Mm][Ee][Ss][Ss][Aa][Gg][Ee] +[\w0-9]+ *;
○ T-SQL.hilight(11): 19,[^@]@[^@]\w
○ maseTeX.hilight(47): 17,\\\w

▼\< または \> を含む定義
× mssql2k.hilight(585): 145,\<
× mssql2k.hilight(586): 145,\>
○ ruby.hilight(124): 17,\$-[0adFiIKlpvwW]\>
× ruby.hilight(8): 49,%[q|Q|w|r|x]\<.*\>
× ruby.hilight(226): 241,$[\!|\@|\&|\+|\`|\'|\=|0-9|\~|\/|\\|\,|\.|\;|\<|\>
|\_|\*|\"|\$|\?|\:|\F]
× ruby.hilight(324): 115,\(\(\<.*\>\)\)
× 吉里吉里 強調・アウトライン解析定義.hilight(105): 411,\<-\>

\w を適切に使っている定義は 4 件で、いずれも [a-zA-Z_]+ に置換可能です。
\> を適切に使っている定義は 1 件で、\b に置換可能です。
\< を適切に使っている定義はありませんでした。

したがって、「\> と \b の違いが問題になるほど技巧的な定義は流通しているか?」
に対しては No と言えそうです。
また、強調表示定義を自分で作っている人は仕様変更にも自分で対応できるでしょう
から、ここでは議論の対象にならないと考えます。

> 変換後の文字列の長さが伸びると、強調できる限界近い長さの定義がある場合、
> 後半部分が削除され、強調定義が不正なものになる可能性が高いです。

ありえますね。そしたらマイグレーション時にエラーを出してユーザーに修正を求め
るしかないですね。

[ ]
RE:04604 正規表現のperl互換 \w \s \d なNo.04633
秀丸担当 さん 09/11/30 10:06
 

Iranoan さん、IKKIさん、h-tomさん、colderさん、コメントありがとうございま
す。
非常にためになります。

強調表示などが1つのネックになりそうだったのですが、IKKIさんの言われるよ
うに以前の\wは[a-zA-Z_]+に変換するというのはいいですね。
定義可能な文字数を超えたときはできないですが、ほとんど無いことだと思うの
で、その場合は変換しないようにしてしまってもいいかと。
これをクリアできれば、デフォルトで新モードでもなんとかなるかもしれません。

\s \d だけあって \w が違うというのも却って混乱するかもしれないです。

>>  [^x] は、現状で改行にマッチするけど、マッチしないように変更
>これは、何故なんでしょうか?
>確かに、躓きやすい所ではありますが、自分が指定した文字以外も対象になる事に、
>違和感を感じます。

なぜ昔からそうだったのかというと、jre32.dllのときからそうだったためで、理
由はいまとなってはわからないです。
なぜ変更したいのかというと、おっしゃる通り自分が指定したもの以外が対象に
なるようで、違和感を感じるためです。

1つ1つのご意見にコメントできず申し訳ありません。
もう少し検討してみます。
ありがとうございます。

[ ]
RE:04611 正規表現のperl互換 \w \s \dなNo.04649
秀まるお さん 09/11/30 21:08
 
> >  [^x] は、現状で改行にマッチするけど、マッチしないように変更
> これは、何故なんでしょうか?
> 確かに、躓きやすい所ではありますが、自分が指定した文字以外も対象になる事に、
> 違和感を感じます。

 これは実は僕が言い出した話なんですが…。

 \Sとか\Dとかをサポートした時に、それを使って置換をすると、改行も含めて
置換されてしまう動作になる可能性が高くて、それは普通ユーザーさんが期待し
ない動作だろなぁと思います。というか、自分自身、[^...]が改行にヒットして
しまうために予想外の置換がされて困った(自分で作ったソフトでありながら自
分自身で原因が分からなくて困った)経験があります。

 ということで、これを機会に、[^...]はデフォルトでは\nにはヒットしないよ
うにしようと思った訳なんですけど。

 デフォルトでは\nにヒットしないようにしてしまって、何かオプションをいじ
った場合には従来互換にもなる、という風にしようかなぁと…。

 [^...]が\nにもヒットすることを前提として正規表現を書いておられる人って
いますかね?。

 なんか余計なことを言ってしまったような気もしますが。

[ ]
RE:04649 正規表現のperl互換 \w \s \dなNo.04650
Iranoan さん 09/11/30 21:50
 
 今日は、Iranoan です。
>  \Sとか\Dとかをサポートした時に、それを使って置換をすると、改行も含めて
> 置換されてしまう動作になる可能性が高くて、それは普通ユーザーさんが期待し
> ない動作だろなぁと思います。
 私自身もこの点は良く忘れます。

 ただ元の C というか UNIX の文化からすると、文字列種の区別はしないで
ストリームとして扱うので、現在の仕様が自然だと思います。
 また、この点まで仕様を変えると、
(1) 現在の \w は Perl など多くのソフトウェアの仕様と異なる
(2) 度々質問や要望の元になる
(3) いっその事仕様を変更しよう
の流れと同種の混乱を生む気もします。つまり、微妙な違いであるが故に、間
違いに気が付かないという混乱が起きるだろうと。

[ ]
RE:04649 正規表現のperl互換 \w \s\dなどNo.04652
h-tom さん 09/11/30 22:34
 

h-tom です。

> \Sとか\Dとかをサポートした時に、それを使って置換をすると、改行も含めて
>置換されてしまう動作になる可能性が高くて、それは普通ユーザーさんが期待し
>ない動作だろなぁと思います。というか、自分自身、[^...]が改行にヒットして
>しまうために予想外の置換がされて困った(自分で作ったソフトでありながら自
>分自身で原因が分からなくて困った)経験があります。
否定文字クラスが、改行を含むことで、悩んだ経験は私にもありますが、
改行文字を特別扱いするのは、賛成できないです。

 [^x] -> x以外の一文字
のハズが、
 [^x] -> xと改行以外の一文字
になるのは、やはり変だとおもいます。

ある意味、一般的な正規表現から外れてしまいますし、別の意味で混乱の元に
なるかもしれません。

> [^...]が\nにもヒットすることを前提として正規表現を書いておられる人って
>いますかね?。
一度悩んだので、それ以来、気にしてますし、なるべく使わないようにはしてい
ます。(前方後方、不一致、一致を使うようにしています。)

でも、通常の秀丸エディタでの検索・置換では、基本的に1行単位なので、そん
なに問題にならないかもしれませんね。
マクロで複数行文字列を相手にする場合は、混乱しそうですが。

[ ]
RE:04652 正規表現のperl互換 \w \s\dなどNo.04653
秀まるお さん 09/11/30 22:39
 
 ということで、やっばり余計な仕様変更はやめておきます。

 いろいろご意見ありがとうございます。

[ ]
RE:04604 正規表現のperl互換 \w \s \d なNo.04661
秀丸担当 さん 09/12/01 11:46
 

この件について、仕切りなおしてまた新しい案で別スレッドにしました。

移動先
turukame.3:04660| 正規表現の \w \s \d などについて(仕切りなおし)
http://www.maruo.co.jp/turukame/3/x04660_.html?a=0#4660

[ ]