出来れば正規表現について教えて下さいNo.27064
KRT さん 09/09/18 14:09
 
秀丸とは関係なく、すみませんが、
数字混在の特定データを< >で抽出し、その後抽出されない数字を全て削除、とい
う事をしたいのですが、スマートな方法があれば教えて下さいませんか?

今やっている方法は、
抽出内の数字をJIS置換する構文を作成
例 <\f0\f[^>]+> -> \00\2
  <[^>]+\f0\f> -> \00\2
   <[^>]+\f0\f[^>]+> -> \00\2
これを、場所による3通り x 0-9の数字 = 30通り作成
変換リストによる連続置換というマクロで一括置換

1回に1字ずつ処理されるので、抽出内に最大10桁の数字があれば、
10回のマクロ処理が必要となります。
例えば、<電話 090-1234-5678 田中> ->
 <電話 090−1234−5678 田中>
その後で、抽出外の[0-9]+を削除。
< >内のみをJISに一括置換するような表現はありませんか?
宜しくお願いします。


[ ]
RE:27064 出来れば正規表現について教えてNo.27065
秀まるお2 さん 09/09/18 18:10
 
 僕が思うにも、KRTさんのやってる通り、何通りもの置換を実行してやる方法
しか無いんじゃないかと思います。

 似たようなので、例えばメールアドレスの「@」よりも前の部分を同じ桁数の
'x'に置換する、というマクロを書いたことがあるんですが、それも適当な正規
表現が不可能で、replaceを連続して大量に書くって処理になってしまいました。

    grepreplace "(\\<[a-z0-9._\\-]{3})(@)([a-z0-9]{2,}\\.[a-z0-9]{2,})"
                , "xxx@\\3"
                , "*.log"
                , "x:\\forumlogsite\\TextLog - AtMark除去"
                , regular, nocasesense;
    grepreplace "(\\<[a-z0-9._\\-]{4})(@)([a-z0-9]{2,}\\.[a-z0-9]{2,})"
                , "xxxx@\\3"
                , "*.log"
                , "x:\\forumlogsite\\TextLog - AtMark除去"
                , regular, nocasesense;

 てな感じのgrepreplace文を大量に書くということになってしまいました。

 何かエレガントな方法があればいいんですけど。

[ ]
RE:27064 出来れば正規表現について教えてNo.27066
IKKI さん 09/09/18 19:49
 
こんにちは。ユーザの IKKI です。

> < >内のみをJISに一括置換するような表現はありませんか?

Perl の tr/// に相当するマクロ命令があれば一発なんですけどね…。

と、暗に秀丸担当さんに要望をお伝えしつつ、当座の対応として
この投稿の末尾に書いたようなマクロはいかがでしょう。

# お使いの秀丸エディタのバージョンが書かれていなかったので、最新ベータ版と仮
定しました。
# マクロに関する質問の際は秀丸エディタのバージョンを明示されることをおすすめ
します。

> 数字混在の特定データを< >で抽出し、その後抽出されない数字を全て削除

これは「<>の外側にある数字を全削除」という意味かと思いますが、

 ・<>の外側に全角数字があるのか。全角数字も削除対象か。
 ・<>で囲まれた範囲が複数行にまたがることがあるのか。
 ・<xx<yy>zz> のような入れ子構造があるのか。あるとしたら、処理対象はど
の範囲か。

といった諸要件によって必要な処理が異なってきます。
実際に使う元データと希望する処理結果を示していただければ、何かアドバイスがで
きるかもしれません。



// <>内の数字を全角にする.mac (秀丸エディタ v8 専用)
setcompatiblemode 0x0200;
gofiletop;
searchdown "<.*?>", regular;
while (result) {
 call TR gettext(foundtopx, foundtopy, foundendx, foundendy, true), "0123456
789", "0123456789";
 insert $$return;
 finddown;
}
endmacro;

TR: // 1文字ずつ変換
while (##i < wcslen($$1)) {
 $$c = wcsmidstr($$1, ##i, 1);
 ##p = wcsstrstr($$2, $$c);
 if (##p < 0) $$r = $$r + $$c;
 else $$r = $$r + wcsmidstr($$3, ##p, 1);
 ##i = ##i + 1;
}
return $$r;

[ ]
RE:27064 出来れば正規表現について教えてNo.27067
colder さん 09/09/18 20:23
 
>数字混在の特定データを< >で抽出し、その後抽出されない数字を全て削除、と
>いう事をしたいのですが

< >で囲まれた部分をユーザ定義の複数行コメントに設定して
数字を削除する際の追加の条件としてコメント部分を除くという方法はどうでしょう
か。

[ ]
RE:27066 出来れば正規表現について教えてNo.27068
KRT さん 09/09/18 21:01
 
有難うございます。
># お使いの秀丸エディタのバージョンが書かれていなかったので、最新ベータ版と
>仮定しました。
バージョン7.11です。失礼しました。以後注意します。

>これは「<>の外側にある数字を全削除」という意味かと思いますが、
その通りです。
> ・<>の外側に全角数字があるのか。全角数字も削除対象か。
抽出前に数字は全て半角にします。
> ・<>で囲まれた範囲が複数行にまたがることがあるのか。
複数行にはまたがりません
> ・<xx<yy>zz> のような入れ子構造があるのか。あるとしたら、処理対象はど
>の範囲か。
入れ子は出ますが、<xxyyzz>と整形してから、全角にします。
数字は任意の位置+個数で存在します。
>
>といった諸要件によって必要な処理が異なってきます。
>実際に使う元データと希望する処理結果を示していただければ、何かアドバイスが
>できるかもしれません。
元データは雑多で、そこから電話番号とか住所とかのデータを拾い、
不要な数字は捨てる、という作業です。1行に<>0-10個あり、各<>には数字が0-
10個位入ります。

下記をコピペして、抽出数字全角.macとして、やってみましたが、Xマークのエラー
が返ってきますが、バージョンをv8にして、再度やります。

>
>
>
>// <>内の数字を全角にする.mac (秀丸エディタ v8 専用)
>setcompatiblemode 0x0200;
>gofiletop;
>searchdown "<.*?>", regular;
>while (result) {
> call TR gettext(foundtopx, foundtopy, foundendx, foundendy, true), "012345
>6789", "0123456789";
> insert $$return;
> finddown;
>}
>endmacro;
>
>TR: // 1文字ずつ変換
>while (##i < wcslen($$1)) {
> $$c = wcsmidstr($$1, ##i, 1);
> ##p = wcsstrstr($$2, $$c);
> if (##p < 0) $$r = $$r + $$c;
> else $$r = $$r + wcsmidstr($$3, ##p, 1);
> ##i = ##i + 1;
>}
>return $$r;

[ ]
RE:27067 出来れば正規表現について教えてNo.27069
KRT さん 09/09/18 21:19
 
有難うございます。
< >をユーザ定義の複数行コメントに追加はしたのですが、その先が解りません。
”追加の条件としてコメント部分を除く”とは?
マクロも作れないので、自分には敷居が高い様な気がします。
これが出来れば、非常に助かりますが。


>
>< >で囲まれた部分をユーザ定義の複数行コメントに設定して
>数字を削除する際の追加の条件としてコメント部分を除くという方法はどうでしょ
>うか。

[ ]
RE:27065 出来れば正規表現について教えてNo.27070
KRT さん 09/09/18 21:22
 
有難うございます。
ご検討頂き感謝致します。

> 僕が思うにも、KRTさんのやってる通り、何通りもの置換を実行してやる方法
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
> 何かエレガントな方法があればいいんですけど。

[ ]
RE:27069 出来れば正規表現について教えてNo.27071
colder さん 09/09/18 21:35
 
>”追加の条件としてコメント部分を除く”とは?
>マクロも作れないので、自分には敷居が高い様な気がします。
>これが出来れば、非常に助かりますが。

マクロで書く場合は
replaceall "[0-9]", "" regular, maskcomment;

置換ダイアログの場合は
ダイアログの一番下にある追加の条件をチェックすると
コメント部分を除くが選択できるようになります。

[ ]
RE:27068 出来れば正規表現について教えてNo.27072
IKKI さん 09/09/18 21:47
 
こんばんは。ユーザの IKKI です。

> > ・<>の外側に全角数字があるのか。全角数字も削除対象か。
> 抽出前に数字は全て半角にします。

それでしたら、マクロの最後 (「endmacro」の上) に

replaceallfast "[0-9]+", "", regular;

を付け加えて半角数字を全削除しちゃえばよさそうですね。

> 元データは雑多で、そこから電話番号とか住所とかのデータを拾い、
> 不要な数字は捨てる、という作業です。1行に<>0-10個あり、各<>には数字が0-
> 10個位入ります。

なるほど。とりあえず、先ほどのマクロで要求は満たせると思います。

もし可能なら、もう少し作業の全体像というか、入力データがどこから来て、出力
データを何に使うのか、といったことがわかれば、大域的に見てより適切な回答がで
きるかもしれません。
# KRT さんのお話を伺う限り、秀丸を使うのが最善ではない可能性を感じています。

> 下記をコピペして、抽出数字全角.macとして、やってみましたが、Xマークのエラー
> が返ってきますが、バージョンをv8にして、再度やります。

お手数かけます。一応、v7 対応に書き直したマクロも例示しておきます。
<>外の数字を全削除する処理も入っています。

ただ、変換対象を数字以外にも拡張しようと思った場合、こちらのマクロは v8 用の
マクロに比べて改造が難しいと思います。


// 抽出数字全角・他数字削除.mac
setcompatiblemode 0x0200;
gofiletop;
searchdown "<.*?>", regular;
while (result) {
 call TR2 gettext(foundtopx, foundtopy, foundendx, foundendy, true), "012345
6789", "0123456789";
 insert $$return;
 finddown;
}
begingroupundo;
replaceallfast "[0-9]+", "", regular;
endgroupundo;
endmacro;

TR2: // 1文字ずつ変換 (半角から全角へ)
##i = strlen($$1);
while (##i > 0) {
 ##c = ascii(rightstr($$1, ##i));
 ##p = strstr($$2, char(##c));
 if (##p >= 0) $$r = $$r + midstr($$3, ##p * 2, 2);
 else if (##c != 0x0d) $$r = $$r + char(##c);
 ##i = ##i - strlen(char(##c));
}
return $$r;

[ ]
RE:27071 出来れば正規表現について教えてNo.27073
KRT さん 09/09/18 21:51
 
>>”追加の条件としてコメント部分を除く”とは?
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>コメント部分を除くが選択できるようになります。

[ ]
RE:27073 出来れば正規表現について教えてNo.27074
KRT さん 09/09/18 21:53
 
素晴らしい!、の一言です。
本当に有難うございます。

>>>”追加の条件としてコメント部分を除く”とは?
>≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理
>しました。≫
>>コメント部分を除くが選択できるようになります。

[ ]
RE:27072 出来れば正規表現について教えてNo.27075
KRT さん 09/09/18 22:35
 
IKKIさん、ご親切に有難うございます。
v7 対応版でやってみましたが、”式がおかしいです”というエラーが出てきます。
マクロは解らないので、すみません。
colderさんの方法(置換ダイアログ)で解決、と思います。

>もし可能なら、もう少し作業の全体像というか、入力データがどこから来て、出力
>データを何に使うのか、といったことがわかれば、大域的に見てより適切な回答が
>できるかもしれません。
># KRT さんのお話を伺う限り、秀丸を使うのが最善ではない可能性を感じています。

入力データはWEBで、雑多な英和文のビジネス文章です。
ポイント部分のみを拾って、簡素化+標準化しようとしています。
ツールは、秀丸、excel、本格置換(一括置換するソフト)、MySQLです。
他のエディタも多少チェックしましたが、秀丸がベストと思ってます。
マクロを作れないので、スマートなやり方は出来てないと思います。

[ ]
RE:27075 出来れば正規表現について教えてNo.27076
KRT さん 09/09/18 22:46
 




[ ]
RE:27075 出来れば正規表現について教えてNo.27077
KRT さん 09/09/18 22:49
 
補足です。
秀丸のマクロ「変換リストによる連続置換」は頻繁に使わせて頂いているツールです。
早いし、正規表現が使えるので重宝ですが、置換リスト10個を事前に設定して、自動
的に順番に処理出来るといいのですが。。

[ ]
RE:27075 出来れば正規表現について教えてNo.27079
IKKI さん 09/09/19 06:53
 
おはようございます。ユーザの IKKI です。

> v7 対応版でやってみましたが、”式がおかしいです”というエラーが出てきます。

そうでしたか。何か私の勘違いがあったものと思いますが、もう解決されたようなの
で、これまでとしておきましょう。

> 入力データはWEBで、雑多な英和文のビジネス文章です。
> ポイント部分のみを拾って、簡素化+標準化しようとしています。

なるほど。ブラウザだけで完結すればいいですが、難しいかもしれませんね。
私が知っている範囲では、こんなソフトもあるようです。ご参考までに…
https://addons.mozilla.jp/firefox/details/427
http://www.kamilabo.jp/copi/

[ ]
RE:27077 出来れば正規表現について教えてNo.27080
山紫水明 さん 09/09/19 09:02
 
 KRTさん,

> 秀丸のマクロ「変換リストによる連続置換」は頻繁に使わせて頂いているツー
> ルです。早いし、正規表現が使えるので重宝ですが、置換リスト10個を事前に
> 設定して、自動的に順番に処理出来るといいのですが。。

 このマクロを作った山紫水明です。
 ご要望のことを直接このマクロで実現はできませんが,必要なリストを事前に
結合して一つのファイルにしておけば可能でしょう。
 ファイル連結にはいろいろツールがあると思いますが,ライブラリにおいてい
る拙作の「ファイルを連結する簡易マクロ」も使えるかも知れません。
 http://hide.maruo.co.jp/lib/macro/connectfile.html

 なおライブラリのマクロに関するご意見やご要望は「秀丸エディタ&鶴亀メー
ル常連 さんフォーラム・マクロ作者のための会議室(秀丸エディタ関連)」
  http://www.maruo.co.jp/turukame/4/index.html の方にお願いします。

     では, (^^)/~
                                    山紫水明(ユーザー)
                                    SANSHISUIMEI

[ ]
RE:27080 出来れば正規表現について教えてNo.27081
KRT さん 09/09/19 14:01
 
山紫水明さん
いつも大変お世話になっております。
作者の方から直接頂き、有難うございます。

>結合して一つのファイルにしておけば可能でしょう。
確かにそうですね、有難うございます。

>「ファイルを連結する簡易マクロ」も使えるかも知れません。
このマクロも貴重で、愛用させて頂いてます。

> なおライブラリのマクロに関するご意見やご要望は「秀丸エディタ&鶴亀メー
>ル常連 さんフォーラム・マクロ作者のための会議室(秀丸エディタ関連)」
>  http://www.maruo.co.jp/turukame/4/index.html の方にお願いします。
了解しました。今後とも宜しくお願いします。

[ ]
RE:27079 出来れば正規表現について教えてNo.27082
KRT さん 09/09/19 14:19
 
IKKIさん、有難うございます。

>私が知っている範囲では、こんなソフトもあるようです。ご参考までに…
>https://addons.mozilla.jp/firefox/details/427
>http://www.kamilabo.jp/copi/
試してみます。お世話になりました。

[ ]