こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

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

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

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

よろしくお願いします。

投稿日時 - 2018-05-15 10:45:14

QNo.9498605

困ってます

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

完全な回答ではないが、参考に。
課題の一部を、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)メイルソフトにメイル文の一部で、仕分けができるような機能がないか
勉強してください。

投稿日時 - 2018-05-15 21:52:07

補足

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

投稿日時 - 2018-05-16 09:53:03

お礼

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

投稿日時 - 2018-05-16 09:53:05

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

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

投稿日時 - 2018-05-16 11:55:19

お礼

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

>世界の学者が考えた正規表現が、一番Powerfullだと思う。
納得です。

投稿日時 - 2018-05-17 10:27:39