Tobias的答案似乎是正确的。只想补充一下,我刚意识到量词在字符类中是没有意义的。我还注意到同事的电子邮件中数字前面和美元符号后面经常有一个空格,所以下面是更好的正则表达式(适用于美元金额):
这不是一个解决方法,但我认为这是一个调整字符偏移的概要。这是因为Word在计算例如
但是这个问题似乎仍然存在与链接以及其他内容的类似问题。我还尝试了相同的范围确定向前的方法,但是反向循环匹配时也遇到了类似的问题。
这里有一个示例文件的工作链接(无ssl):http://www.smithany.com/exampleDollarHighliter.docx 原文: 我看到了几篇其他的StackOverflow帖子,比如这篇: 如何在Word中使用/启用(RegExp对象)正则表达式使用VBA(宏) 关于在Microsoft Word中使用VBA和Microsoft VB脚本正则表达式5.5参考的正则表达式的使用。
这对我有所帮助,我在Word中使用它来突出显示美元金额。
虽然这在文本中的一系列金额上按预期工作(在大部分情况下 - 在其不完美之处,正则表达式故意有些宽松),但当Word文档中存在超链接时,它并不像预期那样工作。
在这种情况下,突出显示的字符偏移似乎以一种不太可预测的方式发生了变化。我猜想这是因为文档.xml源文件中有很多新的xml/css。
最终,我主要的问题是,即使Word文档包含超链接,我能否使用正则表达式来突出显示文档内容?这是一个偏移问题,还是应该在压缩的xml上运行正则表达式,重新压缩并重新打开以获得更好的结果?因为当我在源代码上测试各种正则表达式变体时,我得到了预期的结果,但在格式化Word范围时却没有。
我也在这里问过这个问题:https://social.msdn.microsoft.com/Forums/en-US/3a95c5e4-9e0c-4da9-970f-e0bf801c3170/macro-for-a-regexp-search-replace?forum=isvvba&prof=required,但意识到那是一个古老的帖子...
根据下面的问题,这里有一些可能有用的链接: 一个示例文档 http://www.smithany.com/test.docx 步骤1 http://www.smithany.com/wordusd1.jpg 步骤2 http://www.smithany.com/wordhighlighterrun.jpg 以及发生了什么 http://www.smithany.com/whatactuallyhappens.jpg 临时解决方法:如下所建议,如果不堆叠循环,Word的通配符查找速度很快。试试这个方法:
RegExp.Pattern = "\$\s*([\,\d]*(?:\.\d{2})?)"
在这个灵感的基础上: 超链接范围的起始点和结束点分别指的是什么? 得出了以下结果:
Sub trueUpAttempt()
Dim OrigLength As Long
Debug.Print ActiveDocument.Characters.Count
Dim SelStart As Long
Dim SelEnd As Long
Dim SelLength As Long
Dim rHyperlink As Range
Dim wdHyperlink As Hyperlink
For Each wdHyperlink In ActiveDocument.Hyperlinks
Set rHyperlink = wdHyperlink.Range
'Debug.Print rHyperlink.Start
'Debug.Print rHyperlink.End
'Debug.Print rHyperlink.End - rHyperlink.Start
Debug.Print rHyperlink.End - rHyperlink.Start - Len(rHyperlink)
'there's got to be some way to true up the character offset, even if its ugly
Debug.Print ActiveDocument.Characters.Count + rHyperlink.End - rHyperlink.Start - Len(rHyperlink)
Next
End Sub
这不是一个解决方法,但我认为这是一个调整字符偏移的概要。这是因为Word在计算例如
{HYPERLINK "http://www.smithany.com"} http://www.smithany.com
中的所有62个字符。
编辑 2023年7月22日尝试Tobais的建议的相反方式:Sub DollarHighlighter2()
Set regExp = New regExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim offsetEnd As Long
offsetEnd = Selection.End
regExp.Pattern = "\$([\,\d{1,3}]*(?:\.\d{2})?)"
regExp.Global = True
Set allMatches = regExp.Execute(Selection.text) ' Execute search.
For i = allMatches.Count - 1 To 0 Step -1
'MsgBox allMatches.Item(i)
ActiveDocument.Range(offsetEnd - allMatches.Item(i).FirstIndex, End:=offsetEnd - allMatches.Item(i).FirstIndex + allMatches.Item(i).Length).FormattedText.HighlightColorIndex = wdYellow
Next
End Sub
但是这个问题似乎仍然存在与链接以及其他内容的类似问题。我还尝试了相同的范围确定向前的方法,但是反向循环匹配时也遇到了类似的问题。
这里有一个示例文件的工作链接(无ssl):http://www.smithany.com/exampleDollarHighliter.docx 原文: 我看到了几篇其他的StackOverflow帖子,比如这篇: 如何在Word中使用/启用(RegExp对象)正则表达式使用VBA(宏) 关于在Microsoft Word中使用VBA和Microsoft VB脚本正则表达式5.5参考的正则表达式的使用。
这对我有所帮助,我在Word中使用它来突出显示美元金额。
Sub dollarHighlighter()
Set regExp = New regExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim offsetStart As Long
offsetStart = Selection.Start
regExp.Pattern = "\$([\,\d{1,3}]*(?:\.\d{2})?)"
regExp.Global = True
Set colMatches = regExp.Execute(Selection.Text) ' Execute search.
For Each objMatch In colMatches ' Iterate Matches collection.
Set myRange = ActiveDocument.Range(objMatch.FirstIndex + offsetStart,
End:=offsetStart + objMatch.FirstIndex + objMatch.Length)
myRange.FormattedText.HighlightColorIndex = wdYellow
Next
End Sub
虽然这在文本中的一系列金额上按预期工作(在大部分情况下 - 在其不完美之处,正则表达式故意有些宽松),但当Word文档中存在超链接时,它并不像预期那样工作。
在这种情况下,突出显示的字符偏移似乎以一种不太可预测的方式发生了变化。我猜想这是因为文档.xml源文件中有很多新的xml/css。
最终,我主要的问题是,即使Word文档包含超链接,我能否使用正则表达式来突出显示文档内容?这是一个偏移问题,还是应该在压缩的xml上运行正则表达式,重新压缩并重新打开以获得更好的结果?因为当我在源代码上测试各种正则表达式变体时,我得到了预期的结果,但在格式化Word范围时却没有。
我也在这里问过这个问题:https://social.msdn.microsoft.com/Forums/en-US/3a95c5e4-9e0c-4da9-970f-e0bf801c3170/macro-for-a-regexp-search-replace?forum=isvvba&prof=required,但意识到那是一个古老的帖子...
根据下面的问题,这里有一些可能有用的链接: 一个示例文档 http://www.smithany.com/test.docx 步骤1 http://www.smithany.com/wordusd1.jpg 步骤2 http://www.smithany.com/wordhighlighterrun.jpg 以及发生了什么 http://www.smithany.com/whatactuallyhappens.jpg 临时解决方法:如下所建议,如果不堆叠循环,Word的通配符查找速度很快。试试这个方法:
Sub Macro2()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.highlight = True
With Selection.Find
.Text = "$[0-9,]{1,}"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.highlight = True
With Selection.Find
.Text = "$[0-9,]{1,}.[0-9]{2,3}"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
结束子程序
基本上是获取所有突出显示的金额。 话虽如此,像匹配各种日期格式这样的复杂表达式可能会变得混乱,但我想一步一步地完成它们是完全可能的。
Range.Start
和.End
属性作为“设置”值。Word文档中有太多的非打印(和不可见)字符,这些字符无法被计算在内。对于超链接,它们是字段代码。Word的通配符查找不起作用吗? - Cindy Meister