大括弧[ ]を含む文字列の検索No.33141
柳絮 さん 14/04/25 23:02
 
マクロを使い、英数字の文字列を選択してその前後にすみつき括弧【 】を付けよう
としています。

例えば
<span class=""col_red"">
を選択して
【<span class=""col_red"">】
とするのです。

マクロは
replaceall "【([ -~]{1,})】" , "【\\1】" , regular;
としています。

これで殆どがヒットするのですが、文字列に大括弧[ ]が含まれるとうまく動きませ
ん。例えば
<a href=""[1]"">
のような場合です。

個別に調べてみると閉じる方の大括弧 ] だけはヒットするのですが、大括弧の両方
[ ]、または大括弧の開く方 [ が入っているとうまく行かないようです。

次のようにマクロで大括弧を別に表記してみましたが、それでもうまく行きません。
replaceall "【([\\[\\] -~]{1,})】" , "【\\1】" , regular;

大括弧[ ]を含む文字列をヒットさせるにはどのように書いたらよいのかご教示くだ
さい。

柳絮

[ ]
RE:33141 大括弧[ ]を含む文字列の検索No.33142
K'zawa さん 14/04/26 09:45
 
柳絮さん、こんにちは。
K'zawaです。

h2:33141| 大括弧[ ]を含む文字列の検索
>マクロを使い、英数字の文字列を選択してその前後にすみつき括弧【 】を付けよう
>としています。
<略>
>replaceall "【([ -~]{1,})】" , "【\\1】" , regular;

これだと最初から"【】"付きのところを検索していることになりますが、
そういう話でしょうか?

[ ]
RE:33142 大括弧[ ]を含む文字列の検索No.33143
柳絮 さん 14/04/26 10:19
 
K'zawaさん

ご指摘有難う御座います。何故検索対象にまですみつき括弧【 】があるのか。

ご指摘いただいて私も始めて気がつきました。それはこのコマンドの前にあるコマン
ドが影響しているようです。以前こちらでお教えいただいたものであったのかもしれ
ませんが、このコマンドの前に
replaceall  searchbuffer, "【\\0】" , regular;
というのが入っています。

ですから全体では
replaceall  searchbuffer, "【\\0】" , regular;
replaceall "【([ -~]{1,})】" , "【\\1】" , regular;
と言うことになります。最初からこう書いてご質問すればよかったのですね。

しかし最初の行は私には単なるおまじないで、その意味がわかっていないのです。と
もかくこの2行で大抵の所は思ったような動作が出来ていたのです。

どうぞよろしくお願いします。

柳絮

[ ]
RE:33143 大括弧[ ]を含む文字列の検索No.33144
h-tom さん 14/04/26 11:44
 

h-tom です。

>replaceall  searchbuffer, "【\\0】" , regular;
>replaceall "【([ -~]{1,})】" , "【\\1】" , regular;
>と言うことになります。最初からこう書いてご質問すればよかったのですね。
これだと、最初の置換対象にならなければ、2番目の置換の対象になりませんよ。
(最初から、"【 】"で囲まれていれば別ですが。)

最初の検索パターンは、直前に行った検索・置換と同じなので、その検索パターン
が"[ ]"にマッチしないと、対象外になりますけど、その辺りはどうなってます?


>しかし最初の行は私には単なるおまじないで、その意味がわかっていないのです。と
>もかくこの2行で大抵の所は思ったような動作が出来ていたのです
何がわからないのかが、よくわかりませんが、searchbuffer は、マクロヘルプを
検索すれば出てきます。
http://hidemaruo.mydns.jp:81/helpsite/hidemac/html/060_Keyword_State.html

[ ]
RE:33143 大括弧[ ]を含む文字列の検索No.33145
K'zawa さん 14/04/26 12:03
 
柳絮さん、こんにちは。
K'zawaです。

>replaceall  searchbuffer, "【\\0】" , regular;
>replaceall "【([ -~]{1,})】" , "【\\1】" , regular;

推測するに、この前に選択文字列を検索バッファに取り込む処理がありません
か?getsearch; 等
その選択文字列はそのまま正規表現として使われますので、"[]"が含まれている
と、思ったようにならないのだと思います。
メタ文字を文字そのものと見なす"\Q" 〜 "\E"でくくればいいと思います。

replaceall "\\Q" + searchbuffer + "\\E", "【\\0】" , regular;

ちなみに

>replaceall "【([ -~]{1,})】" , "【\\1】" , regular;

ヒットした文字列と置換文字列が同じになってしまうと思います。
後でresultでもチェックしていぬのなら、すべての"【】"でくくられた文字列を
かぞえているとも考えられますが。

[ ]
RE:33141 大括弧[ ]を含む文字列の検索No.33146
山紫水明 さん 14/04/26 15:14
 
 柳絮さん,

 どうもおやりになりことが今ひとつ不明瞭なようです。

>マクロを使い、英数字の文字列を選択してその前後にすみつき括弧【 】を付け
>ようとしています。
(1)これは範囲選択したその箇所だけ,前後に【 】をつけるということでし
ょうか。それともテキスト中のすべての同じ文字列に,同じことをしたいという
ことでしょうか。
(2)選択する文字は英数字に限られるのか,半角の記号も含まれるのか。もし
全角文字が含まれていたらどう処理するのか。

                          山紫水明

[ ]
RE:33146 大括弧[ ]を含む文字列の検索No.33147
柳絮 さん 14/04/26 22:48
 
K'zawa様
h-tom様
山紫水明様

色々なご助言を有難う御座いました。

質問に混乱がありました。大分前に作ったマクロを改造して2つの処理をさせるよう
にしたのですが、思うように動かない原因が2つ目の処理の方にあると考え、それを
簡略化して書いたので皆様を混乱させてしまいました。問題を切り分けると原因は最
初の処理の方にあることが判りました。皆様の貴重なお時間を無駄にさせたことをお
詫びします。

伺いたいのはreplaceall  searchbuffer, "【\\0】" , regular;に関わる問題でした。



質問を改めて致します。
マクロを使い、英文の中の一部の文字列の前後にすみつき括弧【 】を付けようとし
ています。これはWordで言えばハイライトを付けるようなものです(すみつき括弧で
囲んだ部分はその後の別ルーチンでの処理対象から除外したいので、その前作業をし
ているのです)。その文字列を選択するのは手作業です。

例えば
This refund request was approved on [1] and the negative proforma invoice <a
 href=""proforma.php?IdProforma=[2]"">#[3]{4] created.
という英文があったときに、

refundという単語の前後にすみつき括弧【 】を付けるときに、その前後にいちいち
個別に【 と 】とを付けるのではなく、refundという言葉を選択してマクロを動かす
だけで
This 【refund】 request was approved on [1] and the negative proforma invoic
e <a href=""proforma.php?IdProforma=[2]"">#[3]{4] created.
となるようにしたいのです。

今まで
setcompatiblemode 0x0F;
disabledraw;
getsearch;
replaceall  searchbuffer, "【\\0】" , regular;
endmacro;
というマクロで目的は達していました。なおこれで英数字も半角記号も全角文字も処
理されます(と思っていました)。

ところがこの例文で<a href=""proforma.php?IdProforma=[2]"">を指定してマクロを
動かしても、すみつき括弧【 】がつかないのです。個別に当たると?と[の文字を指
定したときに問題が生ずるようです。

?については選択範囲が?で始まると「正規表現での'|'の前後の文字が無いか、また
は+*?の直前に文字がありません。」というエラーメッセージが出ます。また[が関係
すると「正規表現パターンでのカッコの対応が合っていません。」というエラーメッ
セージが出ます。

どのようにしたらこの問題を解決できるか、お知恵を拝借できれば幸いです。

柳絮

[ ]
RE:33147 大括弧[ ]を含む文字列の検索No.33148
h-tom さん 14/04/27 00:39
 

h-tom です。

まだ、やりたい事とマクロが一致していないです。
>replaceall  searchbuffer, "【\\0】" , regular;
では、選択した範囲だけでなく、replace "all" なので文書全体が対象になりますけ
ど?
範囲選択した部分だけでいいんですよね?

>ところがこの例文で<a href=""proforma.php?IdProforma=[2]"">を指定してマクロを
>動かしても、すみつき括弧【 】がつかないのです。個別に当たると?と[の文字を指
>定したときに問題が生ずるようです。
正規表現は、わかりますよね?
"?"や"["は正規表現で特別な意味を持つ記号なので、その記号自体を検索するには、
"\"を使ってエスケープする必要があります。

>どのようにしたらこの問題を解決できるか、お知恵を拝借できれば幸いです。
そもそも、対象ははっきりしているので、正規表現を使う必要は無いです。
置換で、置換文字列に"\0"を使うには、正規表現を指定する必要がりますが、今回の
場合では、置換文字列も直接指定("【" + 検索文字 + "】")すればいいです。
どうしても正規表現を使うなら、検索文字列で、正規表現で使う記号をすべてエス
ケープ
する必要があります。

置換以外の方法その1
 範囲選択の前後に、必要な文字を入れるだけなので、範囲選択している座標がわかれ
 ば、そこにカーソルを移動させ、必要な文字を挿入すればいい。

置換以外の方法その2
 範囲選択しているなら、貼り付ければ、上書きされる(内容が入れ替わる)ので、範囲
 選択を取り込んで、必要な文字を追加し、貼り付ければいい。

[ ]
RE:33148 大括弧[ ]を含む文字列の検索No.33149
柳絮 さん 14/04/27 07:41
 
h-tomさん

コメントを有難う御座います。
(1)処理の対象は文書全体です。といっても最大でも数センテンスのパラグラフで
すが。その中に同じ文字列が複数回出てくる場合がありますから、それで構いません。

(2)"?"や"["が正規表現で特別な意味を持つ記号であることは承知しています。問
題はそれを含む文字列を選択したときに、そのあとのマクロでどのようにその特殊文
字を処理するかが判らないのです。

(3)しかしお話を伺うと、上の(2)の問題は、「置換文字列も直接指定すれば良
い」との考え方で、きっと解決できるのでしょう。単純な検索置換のやり方を考えて
みます。もう少し試行錯誤をして見ますが、ヒントをいただいたことにまず御礼を申
し上げます。

柳絮

[ ]
RE:33149 大括弧[ ]を含む文字列の検索No.33150
山紫水明 さん 14/04/27 08:34
 
 柳絮さん,

 次のマクロは範囲選択してあればそれを文字列として取り込む,指定がなけれ
ば直接文字列を指定するというものですが,こういうことでいいのですか?

if( selecting ) {
    $s = gettext( seltopx, seltopy, selendx, selendy );
} else {
    $s = input("指定文字列は?");
    if( $s == "" ) endmacro;
}
replaceall "\\Q" + $s + "\\E", "【" + $s + "】", regular;

                          山紫水明

[ ]
RE:33150 大括弧[ ]を含む文字列の検索No.33151
山紫水明 さん 14/04/27 08:48
 
追伸です。
 置換のところはあえて正規表現にする必要もないでしょう。

replaceall $s, "【" + $s + "】";

 ちなみに次のような書き方もあるでしょうが,かえってわかりにくいかもしれ
ません。
replaceall "\\Q" + $s + "\\E", "【\\0】", regular;

                        山紫水明

[ ]
RE:33149 大括弧[ ]を含む文字列の検索No.33152
K'zawa さん 14/04/27 10:00
 
柳絮さん、こんにちは。
K'zawaです。

>(2)"?"や"["が正規表現で特別な意味を持つ記号であることは承知しています。問
>題はそれを含む文字列を選択したときに、そのあとのマクロでどのようにその特殊文
>字を処理するかが判らないのです。

その答えのひとつが、前に書きました「\Q」 〜 「\E」でくくるというものです
が、これは通常、正規表現は必要、でも変数の部分は正規表現として解釈させた
くないというときに使います。

例えば、「$(行末)」を指定したいけど、変数は…というとき
NG: replaceall $s + "$", "", regular;
OK: replaceall "\\Q" + $s + "\\E$", "", regular;

なので、今回のケースでは必ずしも必要ないかも知れませんが。

[ ]
RE:33151 大括弧[ ]を含む文字列の検索No.33153
柳絮 さん 14/04/27 11:12
 
皆様

様々なご助言を有難う御座いました。基本方針はh-tomさんのアドバイスに従い、正
規表現を使わず選択した文字の検索置換で処理することにします。

そこで次のようにしてみました。
setcompatiblemode 0x0F;
disabledraw;
getsearch;
replaceall "searchbuffer", "【" + searchbuffer + "】";

ところがこれが動きません。選択した文字はsearchbufferにある筈ですが、それが検
索対象にならないようです。ただし置換の方ではsearchbufferが働くようです。

$s = gettext( seltopx, seltopy, selendx, selendy );
replaceall "$s", "【" + $s + "】";
としても動きませんでした。

選択範囲を検索対象に取り込むにはどのようにしたらよいのでしょうか。

K'zawaさんと山紫水明さんには以前にも助けていただきましたね。改めて感謝します。

柳絮

[ ]
RE:33153 大括弧[ ]を含む文字列の検索No.33154
山紫水明 さん 14/04/27 11:19
 
 柳絮さん,

>replaceall "searchbuffer", "【" + searchbuffer + "】";

>replaceall "$s", "【" + $s + "】";

searchbuffer や $s には引用符はつけないです。

                          山紫水明

[ ]
RE:33154 大括弧[ ]を含む文字列の検索No.33155
柳絮 さん 14/04/27 13:52
 
山紫水明さん

有難う御座いました。動きました。結局以下の通りです。
setcompatiblemode 0x0F;
disabledraw;
getsearch;
replaceall searchbuffer, "【" + searchbuffer + "】";
endmacro;

ご指摘いただいた「searchbuffer や $s には引用符はつけない」ということが何故
判らなかったのか。

replaceallのあとに検索対象がありカンマを挟んで置換処理が記述されている。その
置換処理のすみつき括弧に引用符が付いているので、検索対象の部分にも引用符を付
けなければならないと錯覚したのです。しかし置換処理の方もよく見るとコマンド自
体には引用符が付いていません。自分の注意不足ですね。

私のような日曜プログラマーは秀丸その他のプログラムを日常的に扱うわけではない
ので、このような簡単なミスをしがちです。皆さんのちょっとしたアドバイスが大き
な助けです。

再度感謝いたします。

柳絮



[ ]