• 締切済み

正規表現の逆?

検索対象の文字列が、正規表現で言うなら あい(う|え)かきく(け|こ)さ・・・ という感じであります。 それを検索したい文字列(1000個程度)の入ったファイルを順に読み込み、マッチしたら切り出し、さらに検索を続けて切り出していくという処理をしたいのですが、何から手をつけていいかわかりません。 どなたか教えてください。

みんなの回答

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.6

いまいち、どういうふうに検索したいのか伝わってこないのですが 例えば「斉藤櫻井」「斉藤桜井」「斎藤櫻井」「斎藤桜井」を検索したいのなら ((斉|斎)藤)((櫻|桜)井)で検索できると思いますが 正規表現を使うまでもないような気もします。 また何の情報も無しに 「斎藤」に対して「斉藤」や「齋藤」も検索させたいのだとすると あらかじめ「斉斎齋」を関連付けるような仕組みが必要です。 とりあえずファイルを読み込む仕組み等の基本的なところ は絶対に必要なわけですから、まず自分なりに作ってみては? それで行き詰ったら改めて質問すると良いと思いますが。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

souorceに格納されるデータの形式は分からないままですが、それも含めての設計だと解釈して回答します。 ループ回数が気になるとのことですので、BoostであればRegexではなくSpiritを使うのはどうでしょう。 テンプレートを駆使して正規表現的な記述が可能ですので、文字列よりはループ回数が緩和されると思います。 Boost.Spiritであれば、マルチバイト文字に対応させることも可能ですし...

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

どうもよく分からないのですが... sourceになる文字列は「あい(う|え)かきく(け|こ)さ・・・」という形式なのですか?それとも、「あいうかきくけさ・・・」や「あいえかきくけさ・・・」のように格納されているのですか? 実際のデータを教えてください。

jan008
質問者

補足

たとえばファイル1に「斎藤」「桜井」といった文字列が1000個くらいあり(このさきもっと増えるかもしれません)、 入力された文字列が「斉藤櫻井」だと、字が違うので検索してもマッチしませんよね。 そこで異体字や表記ゆれを登録したテーブルを用意してチェックすると、 「斉藤櫻井」「斉藤桜井」「斎藤櫻井」「斎藤桜井」の4通りになります。 ファイル1の文字列を正規表現のように検索すればいいのでしょうが、繰り返しの処理になるとループの数が多くなるので、入力した文字列をうまく処理してできないかと思ったのです。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

あと.NETならFrameworkに正規表現ライブラリがありますね。

参考URL:
http://homepage2.nifty.com/IchigoPunch/program/regex.htm
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

>sourceからregexにマッチする部分文字列を探すのではなく、 >regexからsourceにマッチする部分文字列を探すといった感じになるのでしょうか? ファイル(source)の中から 「あい(う|え)かきく(け|こ)さ・・・」(regex) にマッチする部分を探す。 file0001.txt~file1000.textがあるとして file1.txtから 「あい(う|え)かきく(け|こ)さ・・・」を探す あったら該当部分をout.txtに書き込む。 ・ ・ ・ file2.txtから ・ ・ ・ file1000.txtまで繰り返す。 boostを使うなら2つ目のURLの 「'置換'はどうやればいいのですか?」が参考になるでしょう。 対象の文字列から該当する文字列が見つかる度に その部分を置き換えるという処理を行っています。

jan008
質問者

補足

説明べたで申し訳ありません。 今の場合「う」と「え」、「け」と「こ」が表記ゆれの部分で、 必ずしも「う」でなく、「え」になる可能性もあるので、それをふまえると sourceになる文字列を正規表現風にあらわすと「あい(う|え)かきく(け|こ)さ・・・」になると思うんです。 で、fileには「あいうか」「きくこ」といった文字列が入っていて、「あいうか」がマッチするんで、sourceは「きく(け|こ)さ・・・」に。 さらに「きくこ」がマッチして、「さ・・・」と切り出していくということなんですけど。 意図が伝わりますか?

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

とりあえず開発環境(コンパイラとOS)ぐらいは書いておいた方がいいでしょう。 まず、普通C++のコンパイラには、標準で 正規表現を検出する仕組みはありません。 別途ライブラリやdllが必要です。 一番有名なのがboostですね。 http://www.s34.co.jp/cpptechdoc/article/regexpp/index.html http://www.s34.co.jp/cpptechdoc/aftercare/art_24_01.html あい(う|え)かきく(け|こ)さ・・・ と、ある程度文型が決まっているなら検索部分を自分で作っても 良いでしょう。 というかC/C++である必要がないならperlとかの方が簡単かも。

jan008
質問者

補足

失礼しました。 開発環境はVisual C++.NET 2002、Windows XPです。 補足すると表記のゆれの可能性がある文字列を入力し、 そのゆれを拾っていくと「検索される対象自体」が正規表現で表されるような形になり、 さらにそれをファイルにある文字列で切り出していく作業です。 教えていただいたページも見ましたが、私がやりたいのは、 sourceからregexにマッチする部分文字列を探すのではなく、 regexからsourceにマッチする部分文字列を探すといった感じになるのでしょうか? 説明が下手ですみません。

関連するQ&A