ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 880|回复: 9

[求助] 请教:正则表达式反向引用(捕获模式)与或(|)同用为何查找到的内容不全?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-2-20 10:44 | 显示全部楼层 |阅读模式
请教:正则表达式反向引用(捕获模式)与或(|)同用为何查找到的内容不全?

好比,要对于下面的三段文字,两边加上书名号《》:

唐江西元帅晋王景遂之赴洪州也
唐主以金陵去周境才隔一水洪州
唐礼部侍郎知尚书省事钟谟数奉

使用正则表达式替换,查找表达式为:
(唐)江西元帅晋王景遂之赴洪州也|\1主以金陵去周境才隔一水洪州|\1礼部侍郎知尚书省事钟谟数奉

替换表达式为:
《$&》

替换后我预想的结果是:
《唐江西元帅晋王景遂之赴洪州也》
《唐主以金陵去周境才隔一水洪州》
《唐礼部侍郎知尚书省事钟谟数奉》

但实际的结果是:
《唐江西元帅晋王景遂之赴洪州也》
唐《主以金陵去周境才隔一水洪州》
唐《礼部侍郎知尚书省事钟谟数奉》

问题:
1、这是什么原理?为何反向引用的部分,在查找到的内容中缺失了?
2、如果要达到我预想的结果,应该如何改造表达式?

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-20 10:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
改造的话,如果不用捕获模式就没问题,但这里只是以它说明问题。
有时候,捕获模式和或得同时用,否则就不方便。

TA的精华主题

TA的得分主题

发表于 2021-2-20 10:57 | 显示全部楼层
唐(江西元帅晋王景遂之赴洪州也|主以金陵去周境才隔一水洪州|礼部侍郎知尚书省事钟谟数奉)

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-20 11:01 | 显示全部楼层
A1233515 发表于 2021-2-20 10:57
唐(江西元帅晋王景遂之赴洪州也|主以金陵去周境才隔一水洪州|礼部侍郎知尚书省事钟谟数奉)

感谢大神啦!如果文字是这样的呢:

江西唐元帅晋王景遂之赴洪州也
以金陵去周境才唐主隔一水洪州
礼部侍郎知尚书省事唐钟谟数奉

但我又想反向引用相同的部分。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-20 11:05 | 显示全部楼层
虽然这个例子不怎么妥当,但在有的情况下,我需要把一个不短的内容标记出来,在后面多次反向引用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-20 11:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 gemj 于 2021-2-20 11:30 编辑

但在不使用或(|)时,反向引用的部分在查找到的内容中,不会缺失。好比对下面的文字:

唐江西元帅晋王景唐遂之赴洪州也

用表达式查找:
(唐)[^\r唐]*\1[^\r]*

替换为:
《$&》

结果跟预想一致:
《唐江西元帅晋王景遂之赴洪州也》

TA的精华主题

TA的得分主题

发表于 2021-2-20 20:05 | 显示全部楼层
不是很清楚的楼主的确切意图。可试试如下代码的效果:
  1. Sub test()
  2.     '将以“唐”字开头的段落前后加书名号
  3.     Dim t As String
  4.     Dim exp As Object
  5.     With ActiveDocument.Content.Find  '在原文档替换
  6.         t = .Parent.Text
  7.         .Text = "(^13)(唐[!^13]{1,})"  '段落不宜太长,不包括首段落
  8.         .Replacement.Text = "\1《\2》"
  9.         .MatchWildcards = True
  10.         .Execute Replace:=wdReplaceAll
  11.     End With
  12.    
  13.     Set exp = CreateObject("VBScript.Regexp")
  14.     With exp
  15.         .Global = True
  16.         .Pattern = "^(唐[^\r]+)(\r)"
  17.         .MultiLine = True
  18.         Documents.Add.Content.Text = .Replace(t, "《$1》$2")  '在新文档输出正则替换结果
  19.     End With
  20. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-20 21:07 | 显示全部楼层
sylun 发表于 2021-2-20 20:05
不是很清楚的楼主的确切意图。可试试如下代码的效果:

sylun兄实在费心啦!

不过抱歉,问题我没表达清楚。
我的本意,不是要处理这段文字。
只是想以这段文字为例,请教为什么正则表达式会出现这么奇怪的现象:
“为何反向引用的部分,在查找到的内容中缺失了?”
为什么说它奇怪呢?因为反向引用的部分,在第2、3个段落被替换时丢失了,它明明就是第2、3个或内容的组成部分。
而且,查找时,它明显没丢失,是起了作用的。

这个问题,我理解,是我自己对正则表达式的规则理解不全面。
按理,应该有办法,能达到我们预期的效果。

如果能达到预期的效果,那么,以后在类似的运用中,就可以避开这个陷阱了。

实在太感谢啦!辛苦辛苦!

TA的精华主题

TA的得分主题

发表于 2021-2-20 22:54 | 显示全部楼层
请楼主在立即窗口查看如下代码的运行情况
  1. Sub test()
  2.     Dim i As Integer
  3.     Dim t As String
  4.     Dim Exp As Object
  5.     Dim Matches As Object
  6.     Dim Match As Object
  7.    
  8.     t = ActiveDocument.Content.Text
  9.     Set Exp = CreateObject("VBScript.Regexp")
  10.     With Exp
  11.         .Global = True
  12.         .Pattern = "(唐)江西元帅晋王景遂之赴洪州也|\1主以金陵去周境才隔一水洪州|\1礼部侍郎知尚书省事钟谟数奉"
  13. '        .Pattern = "(唐)(江西元帅晋王景遂之赴洪州也|主以金陵去周境才隔一水洪州|礼部侍郎知尚书省事钟谟数奉)"
  14.         .MultiLine = True
  15.         Set Matches = .Execute(t)
  16.         For Each Match In Matches '查看立即窗口的显示
  17.             i = i + 1
  18.             Debug.Print i & vbTab & Match & vbTab & Match.Submatches.Count & vbTab & Match.Submatches(0) & vbTab & Len(Match.Submatches(0))
  19.             Stop
  20.         Next
  21.         .Pattern = "(唐)(江西元帅晋王景遂之赴洪州也|主以金陵去周境才隔一水洪州|礼部侍郎知尚书省事钟谟数奉)"
  22.         Documents.Add.Content.Text = .Replace(t, "《$1$2》")  '在新文档输出正则替换结果
  23.     End With
  24. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-21 09:51 | 显示全部楼层
sylun 发表于 2021-2-20 22:54
请楼主在立即窗口查看如下代码的运行情况

感谢sylun兄!这个代码,确实非常清晰地显示了匹配的内容和过程。方便了解正则表达式的匹配原理!
技术精湛,思路清晰!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 01:22 , Processed in 0.042356 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表