Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么查找/替换zRngResult.Find工作正常,但RegEx myRegExp.Execute(zRngResult)会弄乱范围。开始?_Regex_Vba - Fatal编程技术网

为什么查找/替换zRngResult.Find工作正常,但RegEx myRegExp.Execute(zRngResult)会弄乱范围。开始?

为什么查找/替换zRngResult.Find工作正常,但RegEx myRegExp.Execute(zRngResult)会弄乱范围。开始?,regex,vba,Regex,Vba,我希望在使用VBA的Word文档中的某些单词后选择并添加注释,例如句子中的“not”、“never”、“don”。“查找/替换为通配符”可以正常工作,但“使用通配符”不能与“匹配大小写”一起选择。正则表达式可以“IgnoreCase=True”,但当一个句子中有多个注释时,该词的选择是不可靠的。Range.start似乎正在以我无法理解的方式进行修改。 2010年6月也提出了类似的问题 有没有新的/不同的方法来解决这个问题? 如有任何建议,将不胜感激 使用RegEx的代码如下所示: Functi

我希望在使用VBA的Word文档中的某些单词后选择并添加注释,例如句子中的“not”、“never”、“don”。“查找/替换为通配符”可以正常工作,但“使用通配符”不能与“匹配大小写”一起选择。正则表达式可以“IgnoreCase=True”,但当一个句子中有多个注释时,该词的选择是不可靠的。Range.start似乎正在以我无法理解的方式进行修改。 2010年6月也提出了类似的问题

有没有新的/不同的方法来解决这个问题? 如有任何建议,将不胜感激

使用RegEx的代码如下所示:

Function zRegExCommentor(zPhrase As String, tComment As String) As Long

Dim sTheseSentences As Sentences
Dim rThisSentenceToSearch As Word.Range, rThisSentenceResult As Word.Range
Dim myRegExp As RegExp
Dim myMatches As MatchCollection

Options.CommentsColor = wdByAuthor    

    Set myRegExp = New RegExp
    With myRegExp
        .IgnoreCase = True
        .Global = False
        .Pattern = zPhrase
    End With

    Set sTheseSentences = ActiveDocument.Sentences

    For Each rThisSentenceToSearch In sTheseSentences
        Set rThisSentenceResult = rThisSentenceToSearch.Duplicate
        rThisSentenceResult.Select
        Do
            DoEvents
            Set myMatches = myRegExp.Execute(rThisSentenceResult)
            If myMatches.Count > 0 Then
                rThisSentenceResult.Start = rThisSentenceResult.Start + myMatches(0).FirstIndex
                rThisSentenceResult.End = rThisSentenceResult.Start + myMatches(0).Length
                rThisSentenceResult.Select

                Selection.Comments.Add Range:=Selection.Range
                Selection.TypeText Text:=tComment & "{" & zPhrase & "}"

                rThisSentenceResult.Start = rThisSentenceResult.Start + 1  'so as not to find the same phrase again and again
                rThisSentenceResult.End = rThisSentenceToSearch.End
                rThisSentenceResult.Select
            End If    'If myMatches.Count > 0 Then
        Loop While myMatches.Count > 0
    Next    'For Each rThisSentenceToSearch In sTheseSentences
End Function

由于Word在文本流中存储非打印信息的方式,依赖Word文档中的Range.Start或Range.End位置是不可靠的。对于某些类型的内容,您可以使用Range.TextRetrievalMode解决,但注释插入的非打印字符不受这些设置的影响

我必须承认,我不明白为什么Word内置的带有通配符的Find对您不起作用-任何大小写匹配都不应该是问题。例如,根据这个例子:“从来没有,从来没有,从来没有,完全干旱。”

将查找n-e-v-e-r的所有实例,而不考虑大小写。括号用于定义一系列值,在本例中,是搜索词中每个字母的大写和小写组合

如果您坚持使用正则表达式,那么我的MSDN帖子中描述的解决方法几乎就是您所能做到的:

使用Office Open XML(或者可能是Word 2003 XML)文件格式,您可以使用正则表达式和标准XML处理工具查找信息,将注释“标记”添加到Word XML中,并将其全部关闭。。。当用户看到文档时,它将全部显示在那里


如果您需要在Word UI中执行此操作,则应该使用稍微不同的方法(假设您的目标是Word 2003或更高版本):以范围为基础(可能按段落)浏览文档。使用Range.WordOpenXML属性将文本的XML表示形式读入内存,执行正则表达式搜索,将注释添加为WordOpenXML,然后使用InserXml方法将WordOpenXML写回文档,替换原始范围(段落)。因为您将使用段落对象范围。开始将不是一个因素。

在“从来没有,从来没有,从来没有,完全干旱”这样的句子中。通配符将只找到第二个从不,因为第一个和第三个包含大写字母。有了正则表达式,我找到了所有三个。如能提供Range.WordOpenXML良好示例的指针,将不胜感激。我花了两天时间试图找到一个有效的例子,但运气不佳。我已经下载并安装了OpenXML,但示例中的“using end using”语句不断出现语法错误。有关示例,请参阅我编辑的答案。我不知道这个问题的任何例子的链接,在评论中的讨论太广泛了。在OpenXML中查找肯定会有问题,因为它的文本“运行”可能会由于格式、拼写和其他标记而被分解。您可能想看看这里的openxml和OpenXMLSDK标记,以及MSDN上的OpenXMLSDK论坛。如果您决定就此问题提问,则需要指定是在Word应用程序界面内运行,还是可以在Word外部运行。谢谢您编辑的答案。这很有帮助。我没有想到这个解决办法。但是,它只适用于1到7个字母长的单词。较长的单词,例如“因此”导致错误“查找包含太复杂的模式匹配表达式的文本”。有什么建议吗?为什么需要通配符?我没有看到任何关于原因的提及——在您提供的示例中,当然不需要它们。但是如果你需要它们,那么你唯一的办法就是把搜索词分解成“小规模”的部分,在不同的范围内运行多个Find(不能使用选择),看看它们是否是连续的。在提问时提供所有相关信息真的很有帮助…谢谢你的回答。我只是想确保没有办法处理7组以上的方括号,我忽略了这些。的确,这个小示例并不真正需要通配符。我试着做一个能处理各种情况的潜艇。非常感谢您的回复。
FindText:="[n,N][e,E][v,V][e,E][r,R]"