- 締切済み
このような時どう検索すれば良いのでしょうか
いつもお世話になっています。 テキスト検索ソフトなどで文書を検索する際に、例えば下記のような文字列で人名部分だけ検索結果に表示したい(&出力してリスト化したい)のです。 ------------------------------------------ abc.. [NAME]=suzuki abcdef.. def.. [NAME]=tanaka defghi.. ghi.. [NAME]=yamamoto ghijkl.. ------------------------------------------ 1)人名部分の直前には"[NAME]="のように特定できる文字列があるので検索にはうってつけですが"[NAME]="自体は検索結果には含めたくない。 2)人名部分の直後には半角スペースが入りそれ以降文字列が続きますが、半角スペース以降は検索結果に含めたくない。 正規表現などの使用で可能にする方法があれば、またそういう検索&検索結果のテキスト出力が可能なフリーソフトなどありましたらお教えください。 どうかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- R32C
- ベストアンサー率39% (115/290)
標準入力から名前だけ出力するプログラム です。$はプロンプトです。UNIX(Linux)のコマンドでの 実行の様子を記載しています。 $./name <ken.txt で実行しています。 lexについて簡単に紹介すると字句解析用のツールで 解析スクリプト name.l を渡すと、cのソースプログラム を出力します。ソースプログラムをそのままコンパイル してツールの出来上がりです。
- R32C
- ベストアンサー率39% (115/290)
たまたま、仕事で、昨日やっていたので、flex(lex)でやってみました。 とりあえず、Cygwinでやりました。 実行形式になりますので、これでいいのでしょうか? --------------------------------------------------------------- $ cat ken.txt abc.. [NAME]=suzuki abcdef.. def.. [NAME]=tanaka defghi.. ghi.. [NAME]=yamamoto ghijkl.. $ cat name.l %{ #include <stdio.h> #include <setjmp.h> #include <stdlib.h> extern void Fname(void); %} %% \[NAME\]\=[a-zA-Z]+ { Fname(); } . { ; } %% jmp_buf error; void Fname(void) { printf("%s",yytext+7); } int main(void) { setjmp(error); while(yylex()) ; return 0; } $ flex name.l $ cc lex.yy.c -o name -lfl $ ./name < ken.txt suzuki tanaka yamamoto $
補足
ご回答ありがとうございます。 ごめんなさい、プログラムに関しては素人なのでよくわからないのですが、テキストから名前部分だけ抜き出すプログラムを書いて頂けたのでしょうか? 実行の仕方がわかりません・・(>_<)
- Tacosan
- ベストアンサー率23% (3656/15482)
たいていの正規表現では () なり \(\) でマッチした内容を取り出せるんですが, それでは不足でしょうか? 例えば Perl なら /\[\w+\]=(\.*?)\s+/ でマッチさせておいて, 名前の部分だけを $1 という形で利用できます.
補足
ご回答ありがとうございます。 ごめんなさい、説明不足でした。 私自身がプログラムを書くための質問ではなく、Vectorなどに登録されているテキスト検索ソフトを使用して例題での人名部分を検索結果に表示したいのです。 つまり検索文字列入力フォームにどう書けば人名のみをヒットさせることができるのかが知りたいのです。 "[NAME]=人名"なら"\[NAME\]=[a-z]+"でヒットさせることができたので2)は自己解決しました。 ただ"[NAME]"部分は不必要なので省きたいのです。
お礼
>R32Cさん 長い間お礼のお返事をしないままで大変失礼しました。 お恥ずかしい話ですが結局のところそのあたりは私には理解できず返答に困っていました。すみません。 質問の件では、#1でのお礼内容のように正規表現で検索をかけて結果をテキスト形式で吐き出せるソフトを見つけて、検索結果のテキストに対してさらに置換で[NAME]部分を消すという二段構えで対処しました。 丁寧にご回答と補足をして頂き、大変ありがとうございました。