Regex.Replace而不破坏Word文档的内容(如脚注)

时间:2016-05-10 17:49:26

标签: .net regex replace ms-word interop

我在此方法RegexReplace中有一个Regex.Replace,用于

Globals.ThisAddIn.Application.ActiveDocument.Range().Text = 
   Globals.ThisAddIn.Application.ActiveDocument.Range().Text.RegexReplace()

但是,正如您可能想象的那样,因为我直接处理Text,控制字符会被破坏。

有没有什么好方法可以解决这个问题?

编辑:我知道这个词有本地查找和替换(https://msdn.microsoft.com/en-us/library/f1f367bx.aspx?f=255&MSPPError=-2147217396),但是,我正在寻找积极向前看的能力。所以这条路线不是最优的(如果我只是不知道如何做通配符正向前瞻,我想知道如何)

使用正则表达式的正向前瞻示例如下。

public static string RegexReplace(this string input)
{
       var goalRegEx = new Regex(@"(" + UnicodeLeftSingleQuotation + @"(?=\d{3}(\.|,|\s){1}))"); 
       // positive lookahead. limits to 3 digits. 
       //no more no less. but not inclusive

       // word has find and replace feature that allows to use wildcard using 
       //--- ‘[0-9]{3}[^11-^14^t.^s]{1} --- 
       //however they do not have ability to do positive lookahead.
       return goalRegEx.Replace(input, UnicodeRightSingleQuotation);
}

在上面的代码(?=\d{3}(\.|,|\s){1})表示我想找到3位数后跟空格或逗号或句点但不包括在搜索结果中(所以在这种情况下我试图只替换左单引号

EDIT2:

所以在了解了表达能力后,我尝试使用它来查找和替换使用Word本机查找和替换(快捷键Ctrl + H)和表达式"‘([0-9]{3}>)"。但是,下面的代码似乎没有像我预期的那样工作。

    With find
        .ClearFormatting()
        .Text = "‘([0-9]{3}>)"
        .Replacement.ClearFormatting()
        .Replacement.Text = "’\1"
        .Execute(Replace:=WdReplace.wdReplaceAll, MatchWildcards:=True)
    End With

我将它应用于字符串并且没有运气

‘123 Video provides a powerful way to help you prove your point.
This line contains a patent quote '123 abbreviation that does not need to be changed.  It uses a straight quote.
This line contains a properly formatted patent quote abbreviation ’123. This is what we want to see.

编辑3:似乎AutoFormatAsYouTypeReplaceQuotes和AutoFormatReplaceQuotes必须设置为False才能使用Find进行更新。

0 个答案:

没有答案