• ベストアンサー
  • 困ってます

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

  • 質問No.9498605
  • 閲覧数121
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 69% (46/66)

メッセージ(文章)をパターンに分類する機能(ライブラリ、ロジック)を探しています。

例えば、“こんにちは[$1]さん”というメッセージパターンを事前に登録しておきます。
そして、“こんにちは田中さん”が入力されたら、
それが“こんにちは[$1]さん”というメッセージパターンであり、[$1]は“田中”である、という判定をさせたいです。

この機能を他のシステムに組み込みたいため、
ライブラリとして呼び出せるようなソースコードorモジュールはあるでしょうか?

言語はExcelVBAだと嬉しいですが、他の言語でも情報が欲しいです。

よろしくお願いします。

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

  • 回答No.1
  • ベストアンサー

ベストアンサー率 28% (4503/16080)

完全な回答ではないが、参考に。
課題の一部を、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

お礼率 69% (46/66)

入力データはメールではなく、システムから吐き出されるログ(.txt)です。出力はExcelかAccessの予定です。
パターンは1000種類程です。
投稿日時:2018/05/16 09:53
お礼コメント
fxgame1224

お礼率 69% (46/66)

ありがとうございます。
やはりパターンを1つずつループを回さなければいけないのですね。
参考にします。
投稿日時:2018/05/16 09:53

その他の回答 (全1件)

  • 回答No.2

ベストアンサー率 28% (4503/16080)

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

お礼率 69% (46/66)

ありがとうございました。
できるだけ知りたい要素だけに絞って質問しましたが、
問題の背景や扱うデータによって最適解が変わってくるものなのですね。
質問が良くなかったようです。

>世界の学者が考えた正規表現が、一番Powerfullだと思う。
納得です。
投稿日時:2018/05/17 10:27
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ