带有超链接 ActiveDocument.Range 和 Format 的正则表达式

2024-04-11

托比亚斯的回答似乎就是门票。只是想补充一点,我刚刚意识到量词在字符类中毫无意义。还注意到同事的电子邮件通常在数字前面和美元符号后面有一个空格,因此下面是一些更好的正则表达式(对于美元金额):

RegExp.Pattern = "\$\s*([\,\d]*(?:\.\d{2})?)"

从中得到一些启发:超链接 range.start 和 range.end 指的是什么? https://stackoverflow.com/questions/58390508/what-does-a-hyperlink-range-start-and-range-end-refer-to想出了这个:

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

这不是一个解决方案,但我认为这是协调字符偏移的轮廓。这都是因为单词正在计算例如中的所有 62 个字符{HYPERLINK "http://www.smithany.com"} http://www.smithany.com

Edit2023 年 7 月 22 日尝试相反的托拜斯建议:

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 http://www.smithany.com/exampleDollarHighliter.docx

原来的:我看过其他几篇 StackOverflow 帖子,例如这篇文章:如何在word中使用VBA(宏)使用/启用(RegExp对象)正则表达式 https://stackoverflow.com/questions/25102372/how-to-use-enable-regexp-object-regular-expression-using-vba-macro-in-word有关使用 Microsoft VB 脚本正则表达式 5.5 参考在 Microsoft Word 中通过 VBA 使用正则表达式的信息。

这帮助我准备了以下内容,我在 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 文档中存在超链接时,它不会按预期工作。

在这种情况下,突出显示的字符的偏移量似乎以某种不可预测的方式发生了变化。我认为这是因为 document.xml 源文件中有很多新的 xml/css 。

最终,我的首要问题是,我可以使用正则表达式来突出显示 Word 文档内容,即使它包含超链接吗?这是一个偏移问题还是我应该在压缩的 xml 上运行正则表达式,重新压缩并重新打开以获得更好的结果?当我在源代码上测试各种正则表达式变体时,我得到了预期的结果,但在格式化 Word 范围时却没有得到预期的结果。

我也在这里问过这个问题:但意识到这是一个古老的帖子......

对于下面的问题,这里有一些可能有用的链接: 示例文档http://www.smithany.com/test.docx http://www.smithany.com/test.docx step 1 http://www.smithany.com/wordusd1.jpg http://www.smithany.com/wordusd1.jpg Step 2 http://www.smithany.com/wordhighlighterrun.jpg http://www.smithany.com/wordhighlighterrun.jpg以及发生了什么http://www.smithany.com/whatactuallyhappens.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

End Sub

这基本上突出显示了所有美元金额。也就是说,像匹配各种日期格式这样的复杂表达式可能会变得混乱,但我认为一次一步地执行它们是可能的。


我已经很多年没有接触过 VBA 了,但我想这就像骑自行车一样。

不管怎样,这里有一个可以帮助你的潜艇。它基于 Cindy Meister 声音推荐,并使用可选部分的匹配模式集合来填补正则表达式和通配符查找之间的空白。

首先,通配符匹配:$[0-9,]{1,} and $[0-9,]{1,}.[0-9]{2}

毕竟没那么不同,不是吗?但是,为了考虑可选的分数部分,我必须使用两种模式。

这是例程:

Sub WildcardsHighlightWords()
    Dim Word As Range
    Dim WildcardCollection(2) As String
    Dim Words As Variant
    WildcardCollection(0) = "$[0-9,]{1,}"
    WildcardCollection(1) = "$[0-9,]{1,}.[0-9]{2}"
    Options.DefaultHighlightColorIndex = wdYellow
    'Clear existing formatting and settings in Find
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    'Set highlight to replace setting.
    Selection.Find.Replacement.Highlight = True
    'Cycle through document and find wildcards patterns, highlight words when found
    For Each Word In ActiveDocument.Words
        For Each WildcardsPattern In WildcardCollection
            With Selection.Find
                .Text = WildcardsPattern
                .Replacement.Text = ""
                .Forward = True
                .Wrap = wdFindContinue
                .Format = True
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = True
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
            Selection.Find.Execute Replace:=wdReplaceAll
        Next
    Next
End Sub

如果需要的话,应该很容易扩展或修改这种方法。

这突出显示了我所期望的美元金额:

注意:量词中的分隔符{n,m} 在所有本地化中都不相同,例如这是{n;m} 的德语版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有超链接 ActiveDocument.Range 和 Format 的正则表达式 的相关文章

  • 简单的 preg_replace 返回 null

    为什么这个非常简单的 preg replace 返回 null preg replace s test test 这个想法是删除空格 您忘记添加分隔符 preg replace s test test 而且最好使用 s 代替 s 在你的模式
  • Excel宏隐藏特定单元格和合并区域

    我试图根据另一个单元格的值隐藏特定单元格 到目前为止 我设法隐藏整行 但无法隐藏特定单元格 Local Currency value show hide item If Range Currency Value USD Then Range
  • Perl 正则表达式匹配模式的多个实例并替换

    我有一个看起来像这样的字符串 abc 1 2 3 something here foo 10 6 34 somethingelse here def 1 2 another 我想将此字符串拆分为一个数组 其中包含 abc 1 2 3 som
  • VB:在 Adob​​e Illustrator、Photoshop 中分配给布尔属性

    在使用 VBA 自动化 Adob e Illustrator CS3 时 我发现分配一个布尔变量 to a 布尔属性结果总是分配 False Dim New Path As Illustrator PathItem Dim v As Boo
  • 正则表达式 - 避免表达式中出现字符串

    我正在尝试创建一个应该匹配以下情况的正则表达式 如果单词完全匹配 first second third 那么匹配应该失败 但如果它周围有任何字符 那么应该匹配该字符串 我还需要避免字符串中的某些字符集 如果这些字符是字符串的一部分 则匹配结
  • VB FFT - 难以理解结果与频率的关系

    试图理解我正在使用的 fft 快速傅里叶变换 例程 窃取 回收 输入是 512 个数据点的数组 它们是样本波形 测试数据生成到该数组中 fft 将该数组变换到频域 尝试理解频率 周期 采样率和 fft 数组中位置之间的关系 我用例子来说明
  • xpath+ 正则表达式:匹配文本

    我正在尝试编写一个 xpath 以便仅返回包含文本和数字的节点 我想使用正则表达式并希望这能起作用 td matches text d 谁能帮我理解我在这里做错了什么 tr td 1 td td 10 td td a td tr 你缺少量化
  • 使用 Beautifulsoup 和正则表达式提取 10-K Edgar 文件中的文本

    我想从大约 10000 个文件中自动提取 1A 风险因素 部分并将其写入 txt 文件 可以找到带有文件的示例 URLhere https www sec gov Archives edgar data 1800 0001047469190
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • VBA 写入文件时对数值进行四舍五入 - 如何防止?

    在下面的代码中 我在确保文件编写器不会将我的数字四舍五入到一定的小数位数时遇到问题 我需要使用变体 因为有时该值是字符串 有时它是数字 我怎样才能强制它准确地写出变量是什么 例如 下面的代码可能显示 0 00038 我想显示确切的值 Dim
  • 正则表达式 - 从行首和行尾修剪空格[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions Link
  • VBA删除列中的单元格并根据单元格的值左移?

    如果单元格为空 如何删除 B 列 和左移 中的单元格 下面是我所拥有的 但它给出了 应用程序定义或对象定义的错误 Sub DeleteCellShiftLeft For i 1000 To 1 Step 1 If Cells i B Val
  • htaccess 301 重定向 - 删除查询字符串 (QSA)

    我一直在努力处理一些 htaccess 重定向 我只是花了一些时间在堆栈上阅读和搜索 但无法获得适合我的场景的答案 我正在将旧客户端网站的 301 重定向到新客户端 旧页面有参数查询 我想从网址中删除它 menu php idCategor
  • 以编程方式将参数传递到访问报告中

    我有一个现有的 Access MDB 我正在向运行现有报表的现有表单添加一个命令按钮 所做的更改是 此按钮需要传入一个包含正在报告的记录 ID 的参数 当前报告在 MDB 中的每条记录上运行 我已经更改了报告运行的查询 以使用 ID 值参数
  • 在 Excel VBA 中,如何访问存储在已安装的加载项中的子项?

    我已经创建了一个 Excel 加载项 该加载项中有一些模块 假设 module1 是其中之一 在 module1 中 我有一个 sub 声明为 public sub abc end sub 在我的工作簿中 我希望能够使用外接程序中定义的函数
  • PHP正则表达式替换链接url

    我需要添加href 之前http 如果这http 不遵循href or src 以下代码部分有效 部分意味着它考虑 a href 只但不src a s i a href target blank gt 0 a str 预先感谢各位的回复 s
  • 除了使用正则表达式之外,在 Swift 中解析 HTML

    下面是我想在 Swift 中解析的 HTML 代码 td class pinyin a href rsc audio voice pinyin pz yi1 mp3 span class mpt1 y span a a href rsc a
  • 替换字符串列表中的 \x00 的最佳方法?

    我有一个来自已解析 PE 文件的值列表 其中包括 x00每个部分末尾的空字节 我希望能够删除 x00字符串中的字节而不删除所有字节 x 文件中的 s 我试过做 replace and re sub 但并没有取得太大成功 使用Python 2
  • 在 Word 2010 中开发功能区选项卡,在组标签名称中使用 & 符号

    我正在开发一个用于模板的功能区选项卡 MyTemplate dotm 对于 Word 2010 我的问题 我想在组的标签中使用与号 我尝试了很多方法 也用谷歌搜索了很多关于这个问题的信息 但没有任何效果 named amp decimal
  • VBA Excel 选择以字符开头的命名范围

    我在命名范围方面遇到了一些问题 我在不同的工作表上有多个命名范围 我想用VBA隐藏或显示所有这些范围 命名范围的示例 r1 name1 另一张纸上的第二个是r1 name2 因此 所有范围都以前面相同的代码开头 r1 我如何循环遍历以 r1

随机推荐

  • nosql 是什么意思?有人可以用简单的话向我解释一下吗?

    在这篇文章中堆栈溢出架构 http highscalability com stack overflow architecture我读到了一些叫做 nosql 的东西 我不明白它的意思 我试图在谷歌上搜索 但接缝我无法确切地了解它是什么 谁
  • 拖动手势活动时未引发 JavaFX KeyEvent

    所以我的问题是这样的 我正在实现一个 UI 创建工具 需要使用边缘上的拖动手势来调整元素的大小 当在检查是否按下修饰键时执行此拖动 即实现统一缩放 时会出现问题 当拖动手势处于活动状态时 永远不会引发键事件 因此我无法在拖动期间激活 停用此
  • Python 内置函数“compile”。它是干什么用的?

    我遇到了一个内置函数compile http docs python org 2 7 library functions html compile今天 虽然我阅读了文档 但仍然不明白它的用法或适用的地方 请任何人都可以举例说明此功能的使用
  • Python + Twisted + sqlanydb = abort()

    我通过官方 sqlanydb 驱动程序将 Twisted 11 与 SQLAnywhere 12 一起使用 一般来说 它工作得很好 但有时应用程序会因第一个查询中止而崩溃 如果一个查询有效 那么接下来的所有查询也都有效 然而我的测试很少通过
  • 如何检查数组是否多次具有值

    我想看看一个数组是否多次具有相同的值 例如 array array val1 val2 val3 val1 如您所见 在上面的数组中 有 2 x val1 要搜索数组是否包含值 我可以使用 in array 来完成 search in ar
  • PHPMyAdmin / MySql - 添加 ID 字段并自动填充 ID 号

    我有一个非常大的数据库表 近 2000 万条记录 这些记录没有唯一的 ID 号 所以 我插入了新字段 现在 我想用 ID 号填充它 从第一个 ID 号 10 000 001 开始增加 1 仅供参考 我在本地计算机上使用 WAMP 并且我已将
  • 在 keyup 事件上跳过 Primefaces 输入文本的验证,但在提交时验证

    我对输入文本有两个要求 p inputText 的值应立即通过 keyup event 显示在屏幕上的 h outputText 中 该值在数据库中应该是唯一的 我正在使用 Primefaces 4 0 JSF 2 2 以及 Glassfi
  • 将 DBF 文件导入 Sql Server

    我需要一些帮助来解决这个问题 因为我是存储过程的新手 我正在尝试使用此存储过程将 DBF 表导入到 Sql Server 2008 中 CREATE PROCEDURE spImportDB Add the parameters for t
  • 使用异常映射器的 JAX-RS

    我读到我可以创建一个实现javax ws rs ext ExceptionMapper它将把抛出的应用程序异常映射到Response目的 我创建了一个简单的示例 如果在保留对象时电话长度大于 20 个字符 该示例将引发异常 我期望异常映射到
  • 如何调整flexdashboard中的表格高度?

    我有一个 Flexdasboard 其中一个页面包含 1 个绘图 然后在其下面有一个表格 该表当前已被压缩 因此虽然它显示 25 行 但它们都在滚动选项中 因此您一次只能查看其中 2 行 我怎样才能改变这个 我目前正在使用以下代码进行编码
  • FluidPage 中的框,基本闪亮

    是否可以在经典闪亮应用程序中使用 box 元素 作为经典应用程序 我的意思是不是闪亮的仪表板 是的 这是可能的 你可以使用使用Shinydashboard https www rdocumentation org packages shin
  • 如何设置rdlc或ssrs报告中表格的最小行数?

    假设我想在表中设置最小行 当我的数据在表中未满时 只需插入空白行即可完全填充它 这个问题看起来很简单 但找到解决方案确实很难 所以我需要在这里分享一下 1 在表格中设置标题和1个绑定明细行 2 在表中插入空白行 只要您想要填充该行 组外 3
  • TCP 套接字到 Websocket?

    那里有很多 websocket gt 套接字包装器 比如网络套接字 https github com kanaka websockify 但是有相反的可用吗 具体来说 我希望能够使用应用程序连接到 TCP 套接字 并将代理转换为 webso
  • 在其他类构造函数中使用参数化构造函数

    我担心这是一个非常基本的问题 但是我还无法解决它 我有一个class A classA h class ClassA public ClassA ClassA int foo private int foo classA cpp Class
  • 如何在KafkaStream应用程序中获取partitionId和TopicName

    我们如何从 KafkaStream 获取主题名称和分区 id 对于任何其他 Kafka 消费者 我们可以获得主题名称和分区 ID 如下所示 ConsumerRecords
  • Excel 添加从 1 开始的列,递增到 24,然后重置 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 数据溢出导致转换失败(数值)

    我试图将数据从 dbf 文件移动到 SQL Server 2008 中的表 但在多个数字列上收到以下错误 链接服务器 null 的 OLE DB 提供程序 MSDASQL 返回消息 多步 OLE DB 操作生成错误 检查每个 OLE DB
  • 还有一个“此 DAG 在网络服务器 DagBag 对象中不可用”

    这似乎是一个相当普遍的问题 我有一个 DAG 我不仅可以手动触发它airflow trigger dag 但它甚至按照其时间表执行 但拒绝显示在 UI 中 我已经多次重新启动网络服务器和调度程序 按 刷新 十亿次 然后运行它airflow
  • 如何获取上一个或最后一个项目?

    如何获取最后一个或上一个或未选择的项目 然后获取新项目JComboBox 我假设这适用于允许您向其添加项目侦听器的所有对象 String items item 1 item 2 item 3 item 4 JComboBox combo n
  • 带有超链接 ActiveDocument.Range 和 Format 的正则表达式

    托比亚斯的回答似乎就是门票 只是想补充一点 我刚刚意识到量词在字符类中毫无意义 还注意到同事的电子邮件通常在数字前面和美元符号后面有一个空格 因此下面是一些更好的正则表达式 对于美元金额 RegExp Pattern s d d 2 从中得