none
Word VBA WildCardsでの繰り返し表現について RRS feed

  • 質問

  • 引き続き、Word VBAでHTMLタグ処理のマクロ作成をしています。今躓いているのが、繰り返しの表現についてです。
    わたしとしては、一般的な正規表現では
    ?は直前の文字の0または1個の繰り返し、
    *は直前の文字の0個以上の繰り返し、
    {0,1}ならば直前の文字の0又は1個の繰り返し ("?"と同等)、
    であると理解してます。
    しかし、Word VBAでは「0個」という表現ができないように思うのです。
    たとえば、Find.MatchWildcards = Trueとした状態で

    .Text = "\<br ( \/)?\>" とすると
    "<br>" "<br />"いずれもヒットしません。(なぜ? VBAでは"?"の意味が違う?)

    .Text = "\<br ( \/)*\>" とすると
    "<br />" "<br / />"にはヒットしますが、"<br>"にはヒットしません。

    .Text = "\<br ( \/){1,2}\>" とすると
    "<br />" "<br / />"にはヒットするので、次に
    .Text = "\<br ( \/){0,2}\>" とすると「実行時エラー '5560': [検索する文字列]に指定したパターン マッチングが正しくありません。」とエラーが報告されます。

    …きっとVBAの根本的なところでの無理解のせいかと思うのですが、上のようなパターンで" /"の0個以上の繰り返しとはどう表現すべきなのかアドバイスいただけないかと思います。よろしくお願いします。

    2018年2月21日 1:19

回答

すべての返信

  • すみません、上の質問で書き間違いがありました。
    "br"と"( \/)"の間にスペースが入ってしまっていますが、実際にはありません。
    .Text = "\<br( \/)?\>"
    .Text = "\<br( \/)*\>"
    .Text = "\<br( \/){1,2}\>"
    でテストしました。
    2018年2月21日 1:22
  • Word のワイルドカード検索は、一般の正規表現とは違うようです。

    ワイルドカードの種類とその使い方は下記のサイトに記載されておりました。
    https://support.office.com/ja-jp/article/word-ドキュメント内の文字列その他のデータを検索および置換する-c6728c16-469e-43cd-afe4-7708c6c779b7
    「ワイルドカードを使用して検索する」をご参照ください。

    文字あるいは式の繰り返し表現として {n,} という書き方がサポートされていますが、{0,} というようにゼロを指定する書き方はできないようですね。
    参考サイト : https://wordmvp.com/FAQs/General/UsingWildcards.htm

    別のワイルドカードとして

    <br>
    <br />
    <br / />

    のいずれにもヒットするようにワイルドカード「\<br[ />]{1,}」というものを考えてみました。

    2018年2月21日 2:26
  • 情報を示してくださってありがとうございました。結論として0回の繰り返しの表現はない、ということなんですね。ほんとうに、ワイルドカードと正規表現は似て非なるものです。
    「VBA 正規表現」などのキーワードでネット情報を検索すると、一般的な正規表現と同等の説明をそのまま載せて「解説」しているところが多かったです。Officeの使い方を指南するような人でもちゃんと使ってないということですね。
    また、" /"の部分の処理のご提案に感謝します。できればまっとうな正規表現でスマートに書きたいところですがお示しの方法でも用をなすので、一つの方法として使わせていただこうと思います。ありがとうございました。
    2018年2月21日 6:25