文字の抽出No.04091
hrogawa さん 04/02/05 17:40
 
こんにちは。
数千行あるテキストからある文字を抽出したいのですが,うまくマクロが動かず困っ
ています。
例えば,1行はこんな感じです。

<a href="file:///1152.html"; target="_blank">論理アドレス空間</a>,<a href="
file:///0887.html"; target="_blank">物理アドレス空間</a>,<a href="file:///0
470.html"; target="_blank">セグメント</a>,<a href="file:///1955.html"; targ
et="_blank">MMU</a>

この1行のテキストから,「target="_blank">」と「</a>」の間に挟まれた文字だけ
を取り出したいと思っています。
この場合。「論理アドレス空間」「物理アドレス空間」「セグメント」「MMU」です。
このため,以下のようなマクロを組みました。

//-------------------------------------------------------------
//関連用語を抽出
replaceall "<a.*>\\f.+\\f</a>,", "\\1\t", regular;
replaceall "<a.*>\\f.+\\f</a>", "\\1", regular;
endmacro;
//-------------------------------------------------------------

結果は,

セグメント MMU

というものでした。
「論理アドレス空間」「物理アドレス空間」が抽出できません。
どうすればいいのでしょうか。


[ ]
RE:04091 文字の抽出No.04092
たけのこ さん 04/02/05 17:52
 
一般ユーザのたけのこです。

> replaceall "<a.*>\\f.+\\f</a>,", "\\1\t", regular;
> replaceall "<a.*>\\f.+\\f</a>", "\\1", regular;
> endmacro;

<a href="file:///1152.html"; target="_blank">論理アドレス空間</a>,<a href="
file:///0887.html"; target="_blank">物理アドレス空間</a>,<a href="file:///0
470.html"; target="_blank">セグメント</a>,

最初の文で、まで一気にヒットしているからです(欲張りマッチ)。"<a.*>"と、
".+"が欲張りですね。これらの欲張りを抑制してやればいいです。キャラクタク
ラスと補集合を使って、ストッパになる文字を指定してあげればいいでしょう。


(^^)/”

[ ]
RE:04091 文字の抽出No.04093
Iranoan さん 04/02/05 17:56
 
 hrogawa さん今日は、Iranoan です。
> <a href="file:///1152.html"; target="_blank">論理アドレス空間</a>,<a href="
> file:///0887.html"; target="_blank">物理アドレス空間</a>,<a href="file:///0
> 470.html"; target="_blank">セグメント</a>,<a href="file:///1955.html"; targ
> et="_blank">MMU</a>
>
> この1行のテキストから,「target="_blank">」と「</a>」の間に挟まれた文字だけ
> を取り出したいと思っています。
 取り出したあと、その後をどの様に区切るかによりますが、
replaceallfast "<[Aa]\\>([^>]|\\n)+>\\f([^<]|\\n)*\\f</[Aa]>" ,
  "\\1" , regular;
といった要領で良いと思います。

 正規表現は、基本的に最長一致になる点に注意して下さい。

[ ]
RE:04091 文字の抽出No.04094
fun さん 04/02/05 18:14
 
 funです。

以下のようにしたらうまく行くんじゃないでしょうか?
変えたところは、つぎの2つです。

a.* → a.*?
.+  → .+?

//-------------------------------------------------------------
//関連用語を抽出
replaceall "<a.*?>\\f.+?\\f</a>,", "\\1\t", regular;
replaceall "<a.*?>\\f.+?\\f</a>", "\\1", regular;
endmacro;
//-------------------------------------------------------------


※最新の秀丸じゃないと使えないです。ヘルプによると、?をつけるのを
  「ものぐさ」指定と言うそうです。

[ ]
RE:04094 ありがとうございましたNo.04103
hrogawa さん 04/02/06 13:00
 
Iranoanさんとfunさんのマクロとも,期待通りの結果を得られました。
Iranoanさんの正規表現は私には難しすぎてよくわかりませんでしたが,ありがとう
ございました。
現在解読中です。
funさんの「?」というのは,これからも使えそうで助かります。
ただ,ヘルプでは見つからずどういう処理をするのかよくわかりません。
どこをみればいいのでしょう。
秀丸のバージョンは4.06です。

[ ]
RE:04103 ありがとうございましたNo.04104
fun さん 04/02/06 13:32
 
 funです。

>funさんの「?」というのは,これからも使えそうで助かります。
>ただ,ヘルプでは見つからずどういう処理をするのかよくわかりません。
>どこをみればいいのでしょう。
>秀丸のバージョンは4.06です。

秀丸をインストールしたフォルダに、HMJRE.HLP というファイルがあります。
それがヘルプです。

秀丸から参照しようとすると、ちょっと面倒なのですが、以下の手順になる
と思います。
    1.Ctrl + F で検索ダイアログを開く
    2.あいまい検索のチェックをつける。(設定ボタンが押せるようになるはず)
    3.設定ボタンを押す。(あいまい検索の設定ダイアログがひらくはず。)
    4.あいまい検索の設定ダイアログのヘルプボタンを押す。
    5.HmJreのヘルプが開きます。

    6.ヘルプの目次に、「HmJre.dllにおける正規表現」というページが
        あります。
    7.「HmJre.dllにおける正規表現」ページのなかに「ものぐさ」指定
        についてかかれています。

[ ]