文字列型の変数についてNo.35771
yuzukaka さん 17/05/05 17:02
 
条文を読んでいて出てきた条文番号を選択しマクロを実行すると該当条文とその条文
の要約部分がgrepで抽出される。というものを考えておるのですが、うまくいきませ
ん。

例) 第1条を選択しマクロを実行→第1条(国民年金制度の目的)がgrep
   される

  1 copy;//選択中の"第1条"をコピー
 2 beginclipboardread;
  3 $a = getclipboard;//文字列型変数に"第1条"を代入
  4 localgrep "$a",word,nohilight;//条文中から"第1条"にマッチするも
                  のを抽出
 
  4行目を下記のように正規表現と組み合わせるとうまくいきません。
  localgrep "$a(.*)",regular,nohilight;

何卒よろしくお願いいたします。

 yuzukaka

[ ]
RE:35771 文字列型の変数についてNo.35772
でるもんたいいじま さん 17/05/05 19:21
 
こんにちは。秀丸ユーザの「でるもんた・いいじま」です。

>  1 copy;//選択中の"第1条"をコピー
>  2 beginclipboardread;
>  3 $a = getclipboard;//文字列型変数に"第1条"を代入
>  4 localgrep "$a",word,nohilight;//条文中から"第1条"にマッチするも
>                   のを抽出
>  
>  4行目を下記のように正規表現と組み合わせるとうまくいきません。
>   localgrep "$a(.*)",regular,nohilight;

2点ほど。
まず、正規表現の例で、少なくともこの投稿では括弧が全角になっています。
確実に半角にしてください。

全角か半角かを見分けるには、たとえば下記のような方法があります。
1) 1文字だけ選択すれば、反転色の部分のサイズで判読できます。
2) ステータスバーに文字コードを表示する設定にしておけば、
  全角と半角とで別々の値が表示されます。
   #メニューバーから「動作環境」→「ウィンドウ」の枝
   #→ステータスバーの「詳細」→「カーソル位置の文字コード」
  マクロファイルの文字コードとしてはShift_JIS、UTF-16(要BOM)、
  UTF-8(要BOM)が使えますが、いずれの場合でも全角の場合は4桁、
  半角の場合は2桁の値が出ます。
3) 全角括弧を、拡張子 .mac の場合の強調表示の対象にしておく
4) そもそも字形の違いで全角・半角を見分けやすいフォントを選ぶ
  私は古い人間なのでMS 明朝の9ポイント(12ピクセル@96dpi)
  を使っていますが、画面の密度次第ではこのサイズは小さすぎる
  かもしれません。

次に、文字列変数の値と文字列定数とを結合するための記法が根本的に
間違っています。ダブルクォートの中に変数名をそのまま埋め込む
方式は秀丸マクロでは使えませんので、Perl流の発想はいったん捨てて
ください。

正しくは、結合したい文字列変数・文字列定数を '+' 演算子でつなぎます。
今でも広く使われている言語だと、JavaScriptあたりがこの方法を採用
していますね。

#Perlだと数値の加算は '+'、文字列の結合は '.' と書き分けますが、
#秀丸マクロの場合は、'+' の左右が数値型の場合は加算、文字列型の
#場合は結合、と自動判別されます。JavaScriptも同様ですが、こちらは
#数値⇔文字列の自動型変換が発動しうるので、必要に応じて parseInt()
#や toString() を使うと理解しています。

あるいは、秀丸でも最近のバージョンでは sprintf() が使えます。

テストコード:
  $a = "第1条";
  message $a;
  message "$a";
  message "$a(.*)";
  message $a + "(.*)";
  #b = 12345;
  message sprintf("%s[%d]",$a,#b);

取り急ぎ、こんなところで。

[ ]
RE:35772 文字列型の変数についてNo.35775
yuzukaka さん 17/05/06 09:40
 
でるもんた・いいじまさん、こんにちは。

>まず、正規表現の例で、少なくともこの投稿では括弧が全角になっています。
>確実に半角にしてください。

>正しくは、結合したい文字列変数・文字列定数を '+' 演算子でつなぎます。

上記2点で解決しました。

丁寧に説明いただきとても助かりました。
本当にありがとうございました。

[ ]