ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 正则匹配题目出问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-2-19 20:27 | 显示全部楼层 |阅读模式
要求:匹配文档中的五道题目,并且要有五组捕获。
问题:
        1、用"(^\d+[\..、][^\r]*)[\((]([A-Z])[\))]\r((^[①②③④⑤⑥⑦⑧⑨⑩][^\r]*\r)+)([A-Z][\..、][^\r]+\r)*(解析[^\r]+)"。能匹配四道,第五道无法匹配。
       2、改成"(^\d+[\..、][^\r]*)[\((]([A-Z])[\))]\r(.+\r)*((^[①②③④⑤⑥⑦⑧⑨⑩][^\r]*\r)+)([A-Z][\..、][^\r]+\r)*(解析[^\r]+)",没有任何效果。
求救:大声帮我,先谢了。

正则匹配题目出问题.rar

26.57 KB, 下载次数: 17

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-19 20:34 | 显示全部楼层
本帖最后由 weiyingde 于 2022-2-20 13:27 编辑

自我结束战斗,代码如下:
"^\d+[\..、]([^\r]*)[\((]([A-Z])[\))]\r(([^\r①②③④⑤⑥⑦⑧⑨⑩]+\r)*(^[①②③④⑤⑥⑦⑧⑨⑩][^\r]*\r)+)([A-Z][\..、][^\r]+\r)*(解析[^\r]+)"
自我运行检测代码运行的情况:
Sub 自我检查捕获情况()

Set Rege = CreateObject("vbscript.regexp")
    Rege.Global = True
    Rege.MultiLine = True
    Rege.Pattern = "^\d+[\..、]([^\r]*)[\((]([A-Z])[\))]\r(([^\r①②③④⑤⑥⑦⑧⑨⑩]+\r)*(^[①②③④⑤⑥⑦⑧⑨⑩][^\r]*\r)+)([A-Z][\..、][^\r]+\r)*(解析[^\r]+)"
                   '"^\d+[\..、]([^\r]*)[\((]([A-Z])[\))]\r(([^\r①②③④⑤⑥⑦⑧⑨⑩]\r*|^[①②③④⑤⑥⑦⑧⑨⑩][^\r]*\r)+)([A-Z][\..、][^\r]+\r)*(解析[^\r]+)"
Set Reg = CreateObject("vbscript.regexp")
    Reg.Global = True
    Reg.MultiLine = True
    Reg.Pattern = "[A-Z]+[\..][①②③④⑤⑥⑦⑧⑨⑩]+((?!([A-Z][\..]))[^\r])+"

sr = ActiveDocument.Content

For Each mhk In Rege.Execute(sr)
         sr0 = mhk.submatches(0) '标题
         sr1 = mhk.submatches(1) '答案
         sr2 = mhk.submatches(2) '题干
         sr3 = mhk.submatches(3) '题干最先一段
         sr4 = mhk.submatches(4) '题干最后一段
         sr5 = mhk.submatches(5) '选肢
        ' sr6 = mhk.submatches(6) '解析
     For i = 0 To mhk.submatches.Count - 1
        MsgBox mhk.submatches(i)
     Next
Next

End Sub


居然发现其中多出两组非我想要的两组捕获:
仔细检查代码,对照正则的相关知识,我始终不明白为什么:
    自我分析代码:
    1、^\d+[\..、]([^\r]*)[\((]([A-Z])[\))],此为第一组捕获,要求捕获每一个题目的标题,达到预期;
    2、[\((]([A-Z])[\))]\r,此为第二组捕获,要求捕获每一个题目的答案,达到预期;
    3、(([^\r①②③④⑤⑥⑦⑧⑨⑩]+\r)*(^[①②③④⑤⑥⑦⑧⑨⑩][^\r]*\r)+),红色的括号为第三组捕获,要求捕获每一个题目的题干,达到预期;
         可是另外却多处两组预期之外的捕获。
        第一组是:([^\r①②③④⑤⑥⑦⑧⑨⑩]+\r)*,查询相关知识,此处的括号应为“非捕获性”,其作用是“分组”,与后面的量词“*”相配合,并非有捕获作用,可是程序却当作“捕获”作用,为什么?
       第二组是:(^[①②③④⑤⑥⑦⑧⑨⑩][^\r]*\r)+ ,道理与上相同,也是分组作用,程序也当做“捕获”作用使,怪也!
       我们知道:成对去掉捕获作用的括号,不会影响影响Rege.Execute(sr)的运行,可是删去这两对括号,程序出错,很显然他们应该不是“捕获性括号”,既然不是程序又为什么会生成两个捕获结果呢?
       真是百思不得其解!!
       有请大侠帮我分析一下。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-21 11:58 | 显示全部楼层
再次请教,希望高手不吝赐教,在此专后大家。

TA的精华主题

TA的得分主题

发表于 2022-2-26 21:17 | 显示全部楼层
感觉分组一般是捕获性的,只是捕获的情形可能不同。如果不想捕获,可在该子表达式前加上“?:”。另外,零宽断言也不捕获。可试试如下表达式的效果:(^\d+[\..、][^\r]+)[\((]([A-Z])[\))]\r((?:[^\r①-⑩]+\r)?(?:^[①-⑩][^\r]+\r)+)((?:[A-Z][\..、][^\r]+\r)+)(解析[^\r]+)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-27 07:59 | 显示全部楼层
sylun 发表于 2022-2-26 21:17
感觉分组一般是捕获性的,只是捕获的情形可能不同。如果不想捕获,可在该子表达式前加上“?:”。另外,零宽 ...

感谢大侠一如既往地指导,谢谢你了。后续还有正则方面的难题还望多多指教。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-29 20:15 , Processed in 0.020601 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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