文字列中の正規表現でのバックスラッシュNo.09170
でるもんたいいじま さん 16/10/28 11:56
 
でるもんた・いいじまです。

turukame.3:09169 に関連して。

マクロで正規表現を使うときに、\0〜\9(に限らず \d とか \s とかも)のバックス
ラッシュを二重にしわすれて、というミスが昔から頻発していますよね。今は R"...
" や @"..." があるから今後は「わからなければ @"..." を推奨」で通すにしても、
いろいろな理由で旧来の記法を使わざるを得な
いケースはあると思います。たとえば、@"..." 以前のバージョンの秀丸が多数のマ
シンに入っていて入れ替えのタイミングが確保できないとか、関連のソースコードを
秀丸マクロ以外の言語と共有しているから@"..."は使えないとか。

で、turukame.3:09169 で書いたとおり、秀丸マクロの文字列では、8進数の \ooo 形
式によるコード指定ができません。たとえば、
message "\101";
と書いても、「A」ではなく「101」が出ます。

というわけでやっと本題なのですが、秀丸マクロの文字列中で、「エスケープ記号と
解釈される \ のあとに、文字列内での特殊記号を形成しない文字が来る組み合わ
せ」、たとえば \1、\d、\s あたりが出てきた場合はデフォルトで警告を出すように
できないでしょうか。

具体的には、たとえば
$a = "^\d+\s*:";
のように書いてあったら、マクロの構文解釈時に
| 警告
| 正規表現の \ をマクロの文字列中に記入するには \\ とする必要があります。
| C:\Users\delmonta_iijima\hidemaru\xxx.mac(1): \d,\s
| C:\Users\delmonta_iijima\hidemaru\xxx.mac(3): \f
| C:\Users\delmonta_iijima\hidemaru\xxx.mac(27): \1
| (数が多いので以後省略しました。)
のように出すことはできないでしょうか。

過去との互換性を考えればデフォルトでは警告OFFが穏当なのでしょうけど、気付か
ずにバージョンアップする人が大半でしょうから、デフォルト(レジストリの該当ビ
ットが立っていない)ではこの警告をONにしておいて、動作環境 - 検索 で明示的に
OFFにした場合のみ警告OFF、という強硬策のほうが効果的なように思います。

よろしくご検討のほどお願いします。

[ ]
RE:09170 文字列中の正規表現でのバックスNo.09173
天翔記.jp さん 16/10/28 12:34
 
ちょっと脇なのですが、正規表現に対しては「@」や「R」はいうほどは適していませ
ん。

raw文字列は「書いてある通り」にする系のものですが、
正規表現は、「書いてある通り」にしては、逆に困るはずです。

たとえは、正規表現中に\nとかけば、ほとんどのシーンでは改行マッチ希望であって、
\nという文字列とのマッチではないでしょう。
一方で、\dなどは\dという文字であってほしい。

スクリプト言語などで、独特の記号でくくるのはこの特殊な解釈モードへの意思表現
です。


[ ]
RE:09173 文字列中の正規表現でのバックスNo.09174
でるもんたいいじま さん 16/10/28 13:16
 
でるもんた・いいじまです。

> ちょっと脇なのですが、正規表現に対しては「@」や「R」は
> いうほどは適していません。
...
> たとえは、正規表現中に\nとかけば、ほとんどのシーンでは改行マッチ
> 希望であって、\nという文字列とのマッチではないでしょう。

それは正規表現エンジンの実装に依存しますね。秀丸やPerlの正規表現エンジンは、
「文字列パーサーがどっちの意味に解釈しても正規表現エンジンは期待通りに動く」
という設計になっています。

まず、秀丸はマクロ言語である前にテキストエディタなので、検索ダイアログに U+0
05C U+006E の2文字が入力された場合にそれを改行と解釈する正規表現パーサーを、
マクロエンジンとは完全に独立に持っています。で、この正規表現パーサーは、U+00
0D U+000A の2文字が検索・置換ダイアログにペーストされて、それを受け取った場
合にも、こ
れを改行と解釈します。

実際問題として、マクロで
replaceallfast "\\n", "", regular; // "\n" ではないことに注意
としても、きちんと改行を全部取り除きます。

あるいはPerlでは、正規表現の /.../ の中にスカラー変数を書いて、そのスカラー
変数に記載された正規表現をインタプリタに解釈させることができます。外部のスト
リーム(コマンドライン引数、ファイル、ネットワーク etc)から正規表現の文字列
を取得して、それをPerlのエンジンで解釈することを想定しているのでしょ
う。

これも以下のサンプルコードを実際に試してみてください。

Windowsなら、
C:\> dir | perl -e "$a=qq#\\n#; while (<>) {s/$a//; print;}"

cshなら
$ ls -l | perl -e '$a="\\n"; while (<>) {s/$a//; print;}'

[ ]
RE:09170 文字列中の正規表現でのバックスNo.09176
秀丸担当 さん 16/10/28 13:49
 

マクロで文字列を解釈するときに「\」の後に続く文字で意味があるものを調べ
てみたところ、以下のものがありました。

  \xhh(\Xhhも同じ)
  \t(\Tも同じ)
  \n(\Nも同じ)
  \r(\Rも同じ)
  \uhhhh
  \Uhhhhhhhh
  \\
  \"

あと、「\'」や「\?」は意味はないですが慣習的に使うかもしれません。

これら以外では、意味が無く、間違いで書いている可能性があるので、警告を出
してもいいと思います。
ただ、今まで動いていたマクロが、バージョンアップで動かなくなったというこ
とになるのは避けたいところです。

V8.66βで警告を出すように変更したものがあって、例えば、
#a= #b #c;
と書いて「+」を忘れているような場合、従来はエラーにならず動いてしまいま
したが、警告を出すようになりました。
この警告はデフォルトで有効で、[その他]→[動作環境]→[トラブル対策]→[そ
の他トラブル対策]で「マクロで問題のある文法の警告を出さない」というオプ
ションで無効にすることができます。
警告はデフォルトで有効でないと意味がないと思うので、同じような方法で検討
してみます。

[ ]
RE:09176 文字列中の正規表現でのバックスNo.09177
でるもんたいいじま さん 16/10/28 14:22
 
でるもんた・いいじまです。

> マクロで文字列を解釈するときに「\」の後に続く文字で意味が
> あるものを調べてみたところ、以下のものがありました。
...
> これら以外では、意味が無く、間違いで書いている可能性があるので、警告を出
> してもいいと思います。
> ただ、今まで動いていたマクロが、バージョンアップで動かなくなったというこ
> とになるのは避けたいところです。

ありがとうございます。お待ちしております。

[ ]