• ベストアンサー

メッセージをパターンに分類する機能

メッセージ(文章)をパターンに分類する機能(ライブラリ、ロジック)を探しています。 例えば、“こんにちは[$1]さん”というメッセージパターンを事前に登録しておきます。 そして、“こんにちは田中さん”が入力されたら、 それが“こんにちは[$1]さん”というメッセージパターンであり、[$1]は“田中”である、という判定をさせたいです。 この機能を他のシステムに組み込みたいため、 ライブラリとして呼び出せるようなソースコードorモジュールはあるでしょうか? 言語はExcelVBAだと嬉しいですが、他の言語でも情報が欲しいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

完全な回答ではないが、参考に。 課題の一部を、WordVBAで処理したものです。 正規表現というものを、使おうとしています。 メイルメッセージの(多分本文だろうが)のテキストをワードの文書に貼り付ける(今回は手動で行う)。テストデータとして使います。 私の場合は「こんにちは田中さん」「こんにちは東野さん」の2文を、適宜の場所に挿入コピー貼り付けしました。またMsgboxは確認用です。本来不要。 ーー ワードのVBEの標準モジュールに Sub RegExpSample3() Dim regEx As Object, Matches As Object, Match As Object ActiveDocument.Range(0, 0).Select Selection.WholeStory Set regEx = CreateObject("VBScript.RegExp") txt = Selection.Text MsgBox txt With regEx .Pattern = "こんにちは..さん" ' パターンを設定します。 ワイルドカードの??は「..」です。2文字を挟むの意味。 .IgnoreCase = False ' 大文字と小文字を区別しないように設定します。 .Global = True ' 文字列全体を検索 End With Set Matches = regEx.Execute(txt) ' Executeメソッドで正規表現にマッチした箇所を取得できます 'MsgBox Matches.Item(0).Value '' → @hugafuga ,マッチしたものの一つ目の要素の値を出力。マッチするものがなければエラー MsgBox "該当Count: " & Matches.Count '' Countメソッドで値が取得できます。 For Each Match In Matches '' ForEachでMatches内の要素を出力できます。 msg = Match.Value MsgBox msg MsgBox Replace(Replace(msg, "こんにちは", ""), "さん", "") Next Match End Sub を貼り付け。(上記はWEB記事を一部修正したもの) 実行。 「鈴木」と「東野」が表示されると思う。 == メイル受信ソフトが何なのか質問以書いてない。マイクロソフト系のOutlookなどならOutlookVBAがあるので、上記を多少の修正で使えるかも。 ーー 名前が見つかった(「鈴木」と「東野」(「などの)後は、特定のフォルダーにでも移すなどのコードが必要だが、これはVBAの範疇でしょう。 Google系のものだと、JavaScriptで扱うところのVBA的なものがあるかもしれない。そこには正規表現が使える可能性は多い。 正規表現はUNIX系統のソフトが出自。 ーー ただし「Pattern=」のところのワイルドカードは、VBAと違い、「こんにちは*さん」や「こんにちは??さん」になると思うので、注意。このほうが本家筋の書き方。 後方参照の「For Each Match In Matches」以下は、VBScriptではできるが、その他の処理系では別の書き方になる可能性が多い。 == お勧め 上記のようにややこしいので (1)この目的に特化したフリーソフトを探すか (2)メイルソフトにメイル文の一部で、仕分けができるような機能がないか 勉強してください。

fxgame1224
質問者

お礼

ありがとうございます。 やはりパターンを1つずつループを回さなければいけないのですね。 参考にします。

fxgame1224
質問者

補足

入力データはメールではなく、システムから吐き出されるログ(.txt)です。出力はExcelかAccessの予定です。 パターンは1000種類程です。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

#1です。補足の >やはりパターンを1つずつループを回さなければいけないのですね。 私は、そうとは言っていません。 質問例の挙げ方が、控えめで、実態が分からない。 データもLOGデータだとも、質問に、当初書いてない。 正規表現を使うなら、Patternが、少数で済むものでないかを、勉強すべきで、 早々と自己流にまとめないこと。 私は質問表現に疑問を持ちながら、事例の実態をよくわからずに回答している面はあるので。 INSTR関数利用やLike演算子の利用も頭に上るが、世界の学者が考えた正規表現が、一番Powerfullだと思う。 それにマイクロソフト系のものは、とりあえず、該当集団を捉えた後に、それを個々にForEachで扱えるので、その時に色々判別や作業ができるのがよいところと思う。 ーー 質問の表現を、出来るだけ、本番に即して、実例を上げて、別質問したら。

fxgame1224
質問者

お礼

ありがとうございました。 できるだけ知りたい要素だけに絞って質問しましたが、 問題の背景や扱うデータによって最適解が変わってくるものなのですね。 質問が良くなかったようです。 >世界の学者が考えた正規表現が、一番Powerfullだと思う。 納得です。

関連するQ&A

専門家に質問してみよう