Excel VBA で、MSHTML.HtmlDocument クラスの createDocumentFromUrl メソッドを使って取得した HTML ドキュメントの中から正規表現を使って文言を抜き出す処理を書いている。
具体的には「JVN iPedia - 脆弱性対策情報データベース」の詳細情報ページから、例えば「想定される影響」と「対策」の部分を抜き出し、Excel上の特定のセルに貼り付ける・・・というような処理だ。
該当する部分の HTML ソースは、例えば、
....<TR><TD class=vuln_table_clase_td_header colSpan=2><Aname=impact>想定される影響</A> </TD></TR><TR><TD colSpan=2><BR><BLOCKQUOTE>攻撃者により、巧妙に細工された utf-8 データを介して、サービス運用妨害 (無限ループ)状態にされる可能性があります。 </BLOCKQUOTE></TD></TR><TR><TD class=vuln_table_clase_td_header colSpan=2><A name=solution>対策</A></TD></TR><TR><TD colSpan=2><BR><BLOCKQUOTE>ベンダより正式な対策が公開されています。ベンダ情報を参照して適切な対策を実施してください。</BLOCKQUOTE></TD></TR>....
このような感じなので、
<A name=impact>想定される影響<\/A>[\s\S]+?<BLOCKQUOTE>([\s\S]+?)<\/BLOCKQUOTE>[\s\S]+?<A name=solution>対策<\/A>[\s\S]+?<BLOCKQUOTE>([\s\S]+?)<\/BLOCKQUOTE><\/TD><\/TR>
こういうマッチングパターン(ベタですまん(^^;もちろんもっと簡潔にすることはできるが、あとから他人がメンテナンスすることを考えて、あえてベタベタにしてるんだということは言うとく。正規表現に関しては口うるさい人間が多いからな(笑))抜くことができるんだけど、うまくいかない。
※ちなみに、Microsoft の正規表現では、改行コードも含んだ任意の文字列だと、.+ ではなく [\s\S]+ と書かないといけないらしい(^^;アホや(笑)
結論から言えば、参照するライブラリファイルとして、Microsoft VBScript Regular Expressions 1.0 と Microsoft VBScript Regular Expressions 5.5 の両方が参照設定されており、1.0の方が優先順位が高かったため。
1.0は、まさに「お馬鹿」な Microsoft 技術者が作りました感満載の糞しょぼい正規表現ライブラリで、複数行へのマッチングオプションなどは考えられていないのだ。
例えば改行を含んだ(つまり複数行の)データにマッチングさせるためのプロパティを、
Dim re As New RegExpre.MultiLine = True....
このように設定していると、「コンパイルエラー:メソッドまたはデータメンバーが見つかりません。」というエラーが発生し、VBAスクリプトの実行ができない。しょぼ。
1.0の優先度を 5.5より落とせばいいが、5.5を参照しているのに 1.0も参照対象として残しておく意味もないので、1.0は参照対象から外してしまおう。
ちなみに、インスタンス化するとき、
Dim re As VBScript_RegExp_55.RegExpre.MultiLine = True....
このように明示的にバージョン設定することも可能なようだ。
もう、VBA やってると精神的に疲れるので試してないけど(^^;;;
コメントする