0

このライブラリを使用して、アプリケーションに Word ドキュメントのメールマージを実装しています: http://www.codeproject.com/Articles/38575/Fill-Mergefields-in-docx-Documents-without-Microso

それはうまく機能しますが、コードを大幅にリファクタリングし、自分のアプリケーションに統合するために他のタスクを実行しました。

ライブラリは、次の正規表現を使用して、Word の差し込み印刷フィールドをキャプチャします。

private static readonly Regex _instructionRegEx = new Regex(
    @"^[\s]*MERGEFIELD[\s]+(?<name>[#\w]*){1}             # This retrieves the field's name (Named Capture Group -> name)
       [\s]*(\\\*[\s]+(?<Format>[\w]*){1})?               # Retrieves field's format flag (Named Capture Group -> Format)
       [\s]*(\\b[\s]+[""]?(?<PreText>[^\\]*){1})?         # Retrieves text to display before field data (Named Capture Group -> PreText)
       [\s]*(\\f[\s]+[""]?(?<PostText>[^\\]*){1})?        # Retrieves text to display after field data (Named Capture Group -> PostText)",
    RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline
);

これは次のような例をキャプチャMERGEFIELD FieldNameGoesHereしますが、フィールド名が二重引用符で囲まれている例に出くわしましたがMERGEFIELD "FieldNameGoesHere"、正規表現はこれらをキャプチャしません。

ご覧のとおり、正規表現は少しハードコアであり、二重引用符を使用するように変更するだけでなく、引用符なしの MERGEFIELD も受け入れるように変更するには、私の現在の正規表現法を超えています。

明らかに最初の行を変更する必要がありますが、正確に変更する方法がわかりません。

4

2 に答える 2

1

更新:二重引用符を名前付きグループの外側に移動しました。

最初の行で、を置き換え(?<name>[#\w]*)"?(?<name>[#\w]*)"?"?RegExでオプションの二重引用符を探します。

于 2012-08-30T22:52:58.030 に答える
0
^[\s]*MERGEFIELD[\s]+"?(?<name>[#\w]*){1}"?

フィールド名にスペースが含まれていると機能しません: MERGEFIELD "My Field Name".

に使える:

MERGEFIELD\s+"(.*?)"

また

MERGEFIELD\s+([#\w]+) 
于 2016-09-01T10:25:51.433 に答える