我正在使用此库在我的应用程序中实现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。
显然第一行需要修改,但我不确定如何修改它。
答案 0 :(得分:1)
更新:将双引号移动到指定组的外部。
在第一行中,将(?<name>[#\w]*)
替换为"?(?<name>[#\w]*)"?
"?
让RegEx查找可选的双引号。
答案 1 :(得分:0)
^[\s]*MERGEFIELD[\s]+"?(?<name>[#\w]*){1}"?
如果字段名称包含空格则不起作用: MERGEFIELD&#34;我的字段名称&#34;。
可以使用:
MERGEFIELD\s+"(.*?)"
或
MERGEFIELD\s+([#\w]+)