正規表現の \w \s \d などについて(仕切No.04660
秀丸担当 さん 09/12/01 11:44
 

HmJre.dll の \w \s \d などの対応について、前のスレッドでご意見をいただき
ありがとうございました。

 前のスレッド:
 turukame.3:04604| 正規表現のperl互換 \w \s \d などについて
 http://www.maruo.co.jp/turukame/3/x04604_.html#4604

社内でいろいろ相談し、やはり互換性は重要ということで、全く違う案となって
しまいましたが仕切りなおして改めて案を書かせていただきます。
またご意見などありましたらコメントいただけると助かります。


●新しい案
・\s \S \d \D を追加
・\w は [a-zA-Z_]+ と同じ(変更なし)
・[^x]で改行マッチはする(変更なし)

・\c を追加して、Perlの\w相当 [a-zA-Z_0-9] と同じ
・\C を追加して、Perlの\W相当 [^a-zA-Z_0-9] と同じ
・\i を追加して、[a-zA-Z_] と同じ
・\I を追加して、[^a-zA-Z_] と同じ
・\b \B を追加して、単語の先頭/最後


setcompatiblemodeも互換性オプションも無しで、追加があるだけです。
\c は Perl では制御文字とぶつかりますが、仕方ないということで。
(制御文字は\x01のように書くのが王道…?)

\c \i とした根拠は以前IKKIさんに紹介していただいたページを参考にしました。
(XMLスキーマのところ)

 参考:
 http://www.regular-expressions.info/refflavors.html
 http://www.regular-expressions.info/xmlcharclass.html

これと同じではないですが、\i\c* と書くことでプログラミング言語の関数/変
数名なども簡単に書けて、\w 1つだけよりも便利かもしれないです。

[ ]
RE:04660 正規表現の \w \s \d などについNo.04662
colder さん 09/12/01 15:15
 
仕様の確認です。

>・\b \B を追加して、単語の先頭/最後

現在ある \< \> との違いは単語に数字が含まれるか否かの違いですか?
単語の先頭/最後よりも他の正規表現と同様に単語境界/非境界の方がいいです。
現在の \b でバックスペースにマッチは廃止ですか?
もしくは、文字クラスの中でのみバックスペースにマッチするのでしょうか?


[ ]
RE:04662 正規表現の \w \s \d などについNo.04663
秀丸担当 さん 09/12/01 16:39
 

>現在ある \< \> との違いは単語に数字が含まれるか否かの違いですか?
>単語の先頭/最後よりも他の正規表現と同様に単語境界/非境界の方がいいです。
>現在の \b でバックスペースにマッチは廃止ですか?

\bはバックスペースでした。
ご指摘ありがとうございます。
\bとかぶる場合は\yとするのが一般的なようなので、\y \Y がいいかもしれない
です。
数字も含む単語の境界というようにしたいと思います。

●変更点
・\bはバックスペースだったので \y \Y にする。
・\yは単語の境界。
 (\<|\> と似ているけど数字も単語に含む)
・\Yはそれ以外の境界。


あと、\s \d が書けるのに \w が従来通りで混乱するかもしれない対策として、
検索ダイアログで \w を入力するとダイアログ右下に注意書きを出すようにしよ
うと思います。
(現状でとても長い検索文字列で赤色の警告表示が出るのと同じ)
そうすれば混乱も少ないのではないかと思います。

[ ]
RE:04660 正規表現の \w \s \d などについNo.04675
colder さん 09/12/02 14:15
 
現在の hmjre.dll の仕様で個人的に最も不便に感じていることに
タグ付き正規表現で最も外側の括弧で囲まれたものしか参照できないことが挙げられ
ます。
これを解決するために、名前付きのタグ付き正規表現の導入を検討して欲しいです。
(?<name>foo)(?k<name>)  <= 鬼車、.NETでの構文
(?P<name>foo)(?P=name)  <= Python、PHPでの構文

それと、入れ子になった括弧にマッチさせるために再帰式も導入して欲しいです。
PHPでは(?P<name)、鬼車では(?g<name>)を使う。

[ ]
RE:04675 正規表現の \w \s \d などについNo.04680
秀丸担当 さん 09/12/02 16:20
 

>現在の hmjre.dll の仕様で個人的に最も不便に感じていることに
>タグ付き正規表現で最も外側の括弧で囲まれたものしか参照できないことが挙げられ
>ます。

名前付きの後方参照について調べてみたところ、けっこう複雑そうです。
今回やろうとしていることからしてみると少々飛躍しているような気がしました。

グループを後方参照の対象としない (?:...) という書き方が一般的にあるようで、
広く使われているようです。
名前付きよりも先にこちらができたらいいかもしれないと思いました。
(?:...)ができたら、(?:xxx(111)xxx(222)xxx) という検索パターンで \1 が 111
を指すというようなことができるのではないかと思います。
対応できるかどうかわかりませんが、もしやるとしたらこちらのほうが対応しや
すいかもしれないです。

[ ]
RE:04680 正規表現の \w \s \d などについNo.04682
colder さん 09/12/02 17:20
 
>グループを後方参照の対象としない (?:...) という書き方が一般的にあるようで、
>広く使われているようです。
>名前付きよりも先にこちらができたらいいかもしれないと思いました。
>(?:...)ができたら、(?:xxx(111)xxx(222)xxx) という検索パターンで \1 が 111
>を指すというようなことができるのではないかと思います。
>対応できるかどうかわかりませんが、もしやるとしたらこちらのほうが対応しや
>すいかもしれないです。

この場合、(?:...)で囲まれた部分にある()だけが後方参照の対象になるのでしょうか?
(?...)の内部にある()だけを後方参照にするというのはhmjre.dllのみの独自仕様で
あり、他の正規表現を使用しているユーザの混乱を招き、あまりよくないように感じ
ます。
また、すべての()を後方参照の対象にするのは、今までの正規表現と互換性が取れな
くなると思うのですが。

(?#なにかのオプション)などを導入するのでしょうか?

[ ]
RE:04682 正規表現の \w \s \d などについNo.04683
秀丸担当 さん 09/12/02 17:42
 

>この場合、(?:...)で囲まれた部分にある()だけが後方参照の対象になるのでしょう
>か?
>(?...)の内部にある()だけを後方参照にするというのはhmjre.dllのみの独自仕様で
>あり、他の正規表現を使用しているユーザの混乱を招き、あまりよくないように感じ
>ます。

(?:...)が対象とならないとどこかに書いてあったのを勝手に解釈してそういうも
のなのかと思い込んでしまいました。
すみません。

言われてみて初めて確認するのですが、鬼車というのが装備されたと思われる某
エディタや、「perl 正規表現 テスト」で検索されて出てきたページで確認して
みたら、(?...)の内部にある()だけを後方参照できました。
検索文字列「(?:xxx(111)xxx(222)xxx)\1」
対象テキスト「xxx111xxx222xxx111」
どうするのが最も標準的といえるのかわかりませんが、こういう解釈もアリと言
えそうな気がします。

[ ]
RE:04683 正規表現の \w \s \d などについNo.04684
秀丸担当 さん 09/12/02 17:47
 

あと肝心なことを書き忘れていましたが、秀丸エディタの正規表現DLLの代替とし
て代表的な bregif.dll でもできたので、こういう解釈で問題なさそうな気がし
ます。

[ ]
RE:04683 正規表現の \w \s \dなどについNo.04685
h-tom さん 09/12/02 20:55
 

h-tom です。

・(?:...)をサポートするは、賛成です。
 hmjre.dllの後方参照は9個までなので、グルーピングが多くなってしまう場合、
 後方参照で括弧を使用したいのに、グルーピングで括弧を消費してしまう場合が、
 ありました。

・\wに関しては、Perl互換 [a-zA-Z_0-9] でもいいと、個人的には思います。
 
 しかし、\wは、Perl/鬼車も、エンコードを意識する(?)ようになってきて、
 英数字というより、単語構成文字になってます。
 BRegIf.dll + bregonig.dll/hmonig.dll で、日本語文書を、「\w」で検索
 すると、記号以外は全てマッチしてしまいます。


>言われてみて初めて確認するのですが、鬼車というのが装備されたと思われる某
>エディタや、「perl 正規表現 テスト」で検索されて出てきたページで確認して
>みたら、(?...)の内部にある()だけを後方参照できました。
>検索文字列「(?:xxx(111)xxx(222)xxx)\1」
>対象テキスト「xxx111xxx222xxx111」
turukame.3:04680に書いてあるとおり、(?:...)はグルーピング専用で、後方参照
の対象外になるだけです。(?:...)の外も、後方参照の対象になりますよ。

検索文字列 :(?:xxx(111)xxx(222)xxx)(333)\1\3」
                    └1┘   └2┘    └3┘
対象テキスト:xxx111xxx222xxx333111333

通常の括弧  :(xxx(111)xxx(222)xxx)(333)
              │  └2┘   └3┘  │└4┘
              └────1────┘

検索文字列 :(000)(?:xxx(111)xxx(222)xxx)(333)\1\4\2
              └1┘      └2┘   └3┘    └4┘
対象テキスト:000xxx111xxx222xxx333000333111

[ ]
RE:04660 正規表現の \w \s \d などについNo.04688
IKKI さん 09/12/03 05:03
 
こんばんは。IKKI です。

> 社内でいろいろ相談し、やはり互換性は重要ということで、全く違う案となって
> しまいましたが仕切りなおして改めて案を書かせていただきます。
> またご意見などありましたらコメントいただけると助かります。

あまりこういうことをユーザーが言うのも変だとは思うのですが……
ちょっと雑感を述べさせてください。

秀丸のビジネスモデルでは、新規ユーザーを継続的に獲得しなければなりません。
しかるに、新規ユーザーが秀丸を敬遠する要因がいくつかある気がします。

 1. 名称
 2. 素朴なルック&フィール
 3. 独特な/癖のある動作仕様

特に 3. については、積み重なった歴史的経緯が (新規ユーザーに見せるべきでない
のに) 隠しきれず表面化している部分が多々あります。
こういった部分をなるべく減らし、デファクトスタンダードがあるならそれに準拠す
るなどして、新規ユーザーに対する敷居を下げることが重要だと思います。

プログラミング用途に関して言えば、統合環境が発達した今、テキストエディタを使
う人の多くはスクリプト言語を書いているんじゃないかと想像します。
スクリプト言語に多く採用されている正規表現ライブラリは PCRE と鬼車です。
新規ユーザーに対する敷居を下げるためには、彼らが使い慣れた正規表現をサポート
することが有効なアプローチになりうると思います。

以上、雑感でした。


> 言われてみて初めて確認するのですが、鬼車というのが装備されたと思われる某
> エディタや、「perl 正規表現 テスト」で検索されて出てきたページで確認

えー、釈迦に説法とは思いますが…
PCRE と鬼車の仕様書はここにあります。もし未読でしたらご参照ください。
http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
http://www.planewave.org/translations/pcre-3.4/pcre.ja.3.html


その他の参考文献
http://www.kt.rim.or.jp/~kbk/regex/regex.html

[ ]
RE:04685 正規表現の \w \s \dなどについNo.04689
IKKI さん 09/12/03 05:12
 
おはようございます。IKKI です。

> ・(?:...)をサポートするは、賛成です。

賛成 1 票。

>  しかし、\wは、Perl/鬼車も、エンコードを意識する(?)ようになってきて、
>  英数字というより、単語構成文字になってます。

これは悩ましいですね。デファクトスタンダードには追随するべきだと思う一方、英
字以外にもマッチしちゃうとほとんど使い所がないという…。
そういう意味では、英字にのみマッチする \i \c を導入するってのは良い落としど
ころなのかも…?

> 通常の括弧  :(xxx(111)xxx(222)xxx)(333)
>               │  └2┘   └3┘  │└4┘
>               └────1────┘

これはぜひサポートしてほしいですが、名前なしだと互換性が失われますね。
colder さんのおっしゃるように名前付きにするしかないのか…。

[ ]
RE:04689 正規表現の \w \s \dなどについNo.04693
秀丸担当 さん 09/12/03 11:36
 

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

(?:...)の件は、colderさんが言われていたのは(?:...)の中だけを対象とすると
いうことか聞かれていたのですね。
(?:...)を対象としないだけで、(?:...)の中も外も()を対象とするというつもり
でした。
例があまりよくありませんでした。すみません。

()の中の()はhmjreにおいては互換性を維持して対象としないべきなのではないか
と思います。


>PCRE と鬼車の仕様書はここにあります。もし未読でしたらご参照ください。

こちらの情報もありがとうございます。
大変参考になります。

ビジネスモデルについてはそろそろ考える時期かとも思っていますが、具体案は
未定です。


> BRegIf.dll + bregonig.dll/hmonig.dll で、日本語文書を、「\w」で検索

hmonig.dllというのも作られていたとは。すごいです。

以前 hmjre2.dll を作ってDLLを切り替えて互換性と標準の両立を…という話もあ
りましたが、現状でbregif.dll等で敷居を下げることもでき、作者様方、大変あ
りがたいです。

[ ]