含まれている文字だけを全角にするには?No.06627
styth さん 11/06/12 05:52
 
 ある文字列の中に、\ / : * ? " < > | が含まれているとします。
 含まれている文字種・文字数ともに0個以上です。
 いっぺんに、含まれている文字を全角にしたいのですが、何か良い手はないで
しょうか?
 よろしくお願いします。

[ ]
RE:06627 含まれている文字だけを全角にすNo.06628
h-tom さん 11/06/12 13:12
 

h-tom です。

> ある文字列の中に、\ / : * ? " < > | が含まれているとします。
> 含まれている文字種・文字数ともに0個以上です。
> いっぺんに、含まれている文字を全角にしたいのですが、何か良い手はないで
>しょうか?
マクロの組み込み関数でやるなら、1文字づつ検索して、置き換えしかないですよ。
hmjre.dllに、ReplaceRegular関数がありますが、これも1文字づつです。

他の外部DLL使うなら、BREGEXP.DLL/bregonig.dll 使える環境を整えて、
Transを使う方法もあります。

[ ]
RE:06627 含まれている文字だけを全角にすNo.06629
秀まるお2 さん 11/06/12 17:57
 
 普通に作るとしたら、

    loaddll "hmjre.dll";
    $s2 = dllfuncstr("ReplaceRegular", "\\", $s, 0, "¥", 1);
    if( $s2 != "" ) {
        $s = $s2;
    }
    $s2 = dllfuncstr("ReplaceRegular", "/", $s, 0, "/", 1);
    if( $s2 != "" ) {
        $s = $s2;
    }
    $s2 = dllfuncstr("ReplaceRegular", ":", $s, 0, ":", 1);
    if( $s2 != "" ) {
        $s = $s2;
    }
    ...
    ...
    ...

 みたいにやるしか無いと思います。

[ ]
RE:06629 含まれている文字だけを全角にすNo.06630
styth さん 11/06/12 19:44
 
loaddll "hmjre.dll";
$s2 = dllfuncstr("ReplaceRegular", "|", "abcdefg|1234567", 0, "|", 1);
if( $s2 != "" ) {
    $s = $s2;
}
insert $s;

 を実行します。すると、以下の様な結果になりました。御確認、願えないでしょう
か?
 よろしくお願いします。

|a|b|c|d|e|f|g|||1|2|3|4|5|6|7|

[ ]
RE:06629 含まれている文字だけを全角にすNo.06631
styth さん 11/06/12 20:17
 
    $s2 = dllfuncstr("ReplaceRegular", "\\", "abcdefg\1234567", 0, "?", 1);
    if( $s2 != "" ) {
        $s = $s2;
    }
    message $s2;

 上記を実行すると、返り値に""が返ります。

$s2 = dllfuncstr("ReplaceRegular", "/", "abcdefg/1234567", 0, "/", 1);

 なら、良いみたいです。

[ ]
RE:06630 含まれている文字だけを全角にすNo.06632
h-tom さん 11/06/12 20:30
 

h-tom です。

>loaddll "hmjre.dll";
>$s2 = dllfuncstr("ReplaceRegular", "|", "abcdefg|1234567", 0, "|", 1);
>if( $s2 != "" ) {
>    $s = $s2;
>}
>insert $s;
>
> を実行します。すると、以下の様な結果になりました。御確認、願えないでしょう
>か?
"|"は、正規表現で使っているメタキャラクターなので、"|"という文字そのものを、
検索したい場合は、エスケープが必要ですよ。
(ReplaceRegularは正規表現を使った文字列置換を行う関数。)
"\"も同じ。

http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/190_CmdSearch_Regular.html

[ ]
RE:06631 含まれている文字だけを全角にすNo.06633
秀まるお2 さん 11/06/12 20:57
 
 ReplaceRegular関数でパラメータ5に数値の1を指定する場合、もしも何も置換
しなかった場合は""を返すって仕様になってます。それで、マクロですが、

    $s2 = dllfuncstr("ReplaceRegular", "\\", "abcdefg\1234567", 0, "?", 1);
    if( $s2 != "" ) {
        $s = $s2;
    }
    message $s;

 のようにすると期待した結果になるはずだと思います。

 置換に成功した場合だけ$sを置き換えるような処理になってます。

 message文で表示するのが$sになってます。

[ ]
RE:06632 含まれている文字だけを全角にすNo.06634
styth さん 11/06/12 20:58
 
$s2 = dllfuncstr("ReplaceRegular", "\\|", "abcdefg|1234567", 0, "|", 1);
 で、うまくいきました

>"\"も同じ。
$s2 = dllfuncstr("ReplaceRegular", "\\\\", "abcdefg\1234567", 0, "?", 1);
 返り値が、""です。間違いを指摘して頂けませんでしょうか?

[ ]
RE:06633 含まれている文字だけを全角にすNo.06635
styth さん 11/06/12 21:05
 
> message文で表示するのが$sになってます。
    $s2 = dllfuncstr("ReplaceRegular", "\\", "abcdefg\1234567", 0, "?", 1);
    message $s2;
 としましたが、返り値は""です。

[ ]
RE:06635 含まれている文字だけを全角にすNo.06636
秀まるお2 さん 11/06/12 21:28
 
    abcdefg\1234567

 という文字列を秀丸マクロで書きたい場合は、

    "abcdefg\\1234567"

 のように、「\」としたい部分を「\\」と書かないとダメです。

 "abcdefg\1234567"では、実質的には"abcdefg1234567"と書いたのと同じにな
ってしまいまして、これだと「\」が入ってないために何も置換されないです。

 ReplaceRegular関数は、何もヒットしなかった場合(置換しなかった場合)は
""を返すって仕様なので、この場合は""が返ってしまいます。

[ ]
RE:06636 含まれている文字だけを全角にすNo.06637
styth さん 11/06/12 22:01
 
 できました。ありがとうございます。

[ ]
RE:06636 含まれている文字だけを全角にすNo.06638
山紫水明 さん 11/06/12 22:39
 
 秀まるお2さん,

styth さんが 06630 で示されている
$s2 = dllfuncstr("ReplaceRegular", "|", "abcdefg|1234567", 0, "|", 1);
を実行すると,結果が
|a|b|c|d|e|f|g|||1|2|3|4|5|6|7|
となる例ですが,これはおもしろい結果ですね。
通常のマクロ文でも,

replaceall "|", "@", regular;

を実行すると,全文字の間と行頭,行末に@が入ります。これは

replaceall ".|\\n", "@\\0", regular;

と同じ結果になるようですが,こういう仕様と見なして,使用しても問題あり
ませんか。

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:06638 含まれている文字だけを全角にすNo.06639
秀まるお2 さん 11/06/13 08:58
 
 "|"だけだと、結果として長さ0の文字列としてヒット可能な所すべてにヒッ
トするので、行頭+すべての文字間+行末にヒットするってことで、これはこれ
で仕様と見て問題ないはずです。

[ ]
RE:06639 含まれている文字だけを全角にすNo.06640
山紫水明 さん 11/06/13 22:41
 
 秀まるお2さん,

 説明ありがとうございます。
「長さ0の文字列」というとらえ方をするのですか。これは「空の文字列」とは
区別されるのですね。実際,
replaceall "", "@";
としても何の変化もありませんので。

                          山紫水明
                          SANSHISUIMEI

[ ]