vba - 将 Range.Text 关联到 Range.Start 和 Range.End

标签 vba ms-word vsto

我使用正则表达式来搜索以下属性返回的纯文本:

namespace Microsoft.Office.Interop.Word
{
    public class Range
    {
        ...
        public string Text { get; set; }
        ...
    }
}

根据匹配,我想更改与纯文本相对应的格式化文本。我遇到的问题是 .Text 属性中的字符索引与 .Start.End 属性不匹配范围对象。有谁知道有什么方法可以匹配这些索引吗?

(我无法使用 Word 通配符查找功能(作为 .NET 正则表达式的替代品),因为它们对于我正在搜索的模式(非贪婪运算符等)来说不够强大)

我可以通过从 Document.Range().Collapse(WdCollapseStart) 开始,然后 range.MoveStart(WdUnitChar, match.Index) 来移动正确数量的字符因为按字符移动会将格式化文本位置与纯文本中的匹配项进行匹配。

我现在的问题是,我总是在格式化文本中出现 4 个字符太远的情况……所以也许这与其他故事范围有关?我不确定...

最佳答案

显然我的比赛仍然失败的原因与隐藏的“Bell”字符有关(char bell = '\a';)。通过将这些替换为 Application.ActiveDocument.Range().Text 中的空字符串,我对此属性的匹配现在与通过以下方式实现的范围正确匹配:

Word.Range range = activeDocument.Range();
range.Collapse(Word.WdCollapseStart);
range.MoveStart(Word.WdUnits.Character, regexMatch.Index);

基本上,您可以通过逐字符移动格式化文本来镜像 .Text 属性中的索引。唯一需要注意的是,您需要从 .Text 属性中删除奇怪的字符,例如响铃字符。

关于vba - 将 Range.Text 关联到 Range.Start 和 Range.End,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3772938/

相关文章:

excel - 如何提取文本字符串中的文本

vba - 我正在尝试在所有工作表中运行此代码,除了工作簿中的一个

c# - 在没有 Word 的服务器上将 Word doc 文件转换为 docx

excel - "Microsoft Office Excel is waiting for another application to complete an OLE action."是什么意思?

VBA 编辑 SharePoint 讨论帖子 (PostItem) 和更新 Web 讨论

c# - 是否可以在未安装 MS Word 的情况下生成 .docx 文件?

javascript - Office 2013和2016 JS api之间的差异

c++ - 我怎样才能在计算机上找到 MS Word 的版本?

outlook - 从存储在 Exchange 中的 ContactInfo 获取 Smtp 电子邮件

c# - 在 Visual Studio 2010/VSTO 4.0 中根据 Outlook (2007/2010) 版本初始化功能区