ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 正则捕获不达目的,分组有误?

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-25 06:07 | 显示全部楼层
wang-way 发表于 2024-8-25 00:13
解析\s+((?:[A-D])(?:(?![A-D]项[^\n]+\n).)+)((?:[A-D])(?:(?![A-D]项[^\n]+\n).)+)((?:[A-D])(?:(?![A-D] ...

商讨一下:
没有测试,你可能没有测试附件,解析部分只有一个段落,而你出现了个“\n”,是不是误以为

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-25 06:19 | 显示全部楼层
lss001 发表于 2024-8-24 23:30
Sub 要求匹配解析捕获四个()
    Dim mt, mk, oRng As Range, n&, m&
    Dim str$, tt$, arr() As Ran ...

经测试验证,Pattern = "(^解析\s*)([A-D].*?){3}$",表达式有问题。
For Each mt In .Execute(str)
  MsgBox mt.submatches(X)
  Next
X”只能取0和1。

TA的精华主题

TA的得分主题

发表于 2024-8-25 08:22 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2024-8-25 09:13 编辑
weiyingde 发表于 2024-8-25 06:19
经测试验证,Pattern = "(^解析\s*)([A-D].*?){3}$",表达式有问题。
For Each mt In .Execute(str)
  ...


"(^解析\s*)([A-D].*?){3}$" '折叠
"(^解析\s*)([A-D].*?)([A-D].*?)([A-D].*?)$" '展开

TA的精华主题

TA的得分主题

发表于 2024-8-25 09:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
weiyingde 发表于 2024-8-24 14:14
你这代码通俗易懂,好理解,方便套用,可能通用性要差点。如果解析项目多一项,譬如有A……;B……;C… ...

将5楼代码改下试试:"^解析\s+([A-D].+?)?([A-D].+?)?([A-D].+?)?([A-D].+?)?$"

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-25 09:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
shenjianrong163 发表于 2024-8-25 09:13
将5楼代码改下试试:"^解析\s+([A-D].+?)?([A-D].+?)?([A-D].+?)?([A-D].+?)?$"

谢谢回复,五楼quqiyuan网友的代码,已经解决问题了,只是我感觉它不够简洁而已……

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-25 10:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

有结果,但层次有些乱。
母串和子串混乱,对后期操作不方便。
如果前面先用.Pattern = "(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*)\r"进行第一层匹配,锚定范围oRng,在此oRng
中用你的表达式.Pattern = "(^解析)|((\s+|)[A-D]项\W+(\;|\。$))"进行第二层匹配,或许还行。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-25 10:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
xjl565135022 发表于 2024-8-24 14:12
Sub test()
Dim reg As New RegExp
With reg

虽然在附件中有“项”字,但在其他地方不是必用的标志,所以不能用“项”作为匹配的关键字。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-25 13:06 | 显示全部楼层
lss001 发表于 2024-8-25 08:22
"(^解析\s*)([A-D].*?){3}$" '折叠
"(^解析\s*)([A-D].*?)([A-D].*?)([A-D].*?)$" '展开

你的这句,是我若有所悟,下面的帖子我谈谈自己的感受……

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-25 13:08 | 显示全部楼层
本帖最后由 weiyingde 于 2024-8-25 15:27 编辑

    我好像懂了。
    谢谢lss001网友的不厌其烦的解答。
    也感谢你和其他网友全程参与了我的两个帖子所涉及的问题的研讨和帮助。
    对于这两天我发的两个帖子,设计的两个问题,对第一个问题,我好像有所感悟。
    结合你的解释:
   "(^解析\s*)([A-D].*?){3}$" '折叠
   "(^解析\s*)([A-D].*?)([A-D].*?)([A-D].*?)$" '展开
   谈谈我的理解,你看是不是正确。
   “解析”内容要求有四次捕获,目前有两表达式是能够达到目的的最优版:
    一是quqiyuan网友的的表达式.Pattern = "(^解析\s+)([A-D].+?)([A-D].+?)([A-D].+?)$"
    二是你的表达式.Pattern = "(^解析\s+)([A-D].+?)([A-D].*?)([A-D].*?)$"
    其实,你两人的表达式基本相同,差别就在于两次的使用:“+”和“*”,“+”是一和多,“*”是零和多,因为正则捕捉三个目标字符串都是“ABCD”等英文字母开头的字符串,而且它们后面的汉字不止一个(如果其后只有一个汉字,量词“*”显然不同),这就是你们两人的效果一致。
    再说正则的匹配和捕捉。
    匹配只要给个模型,正则根据模型进行匹配,其特征比较概括:
    比如:"(^解析\s*)([A-D].*?){3}$",它告诉正则要匹配对象特征是:以“解析”开头,然后三个以英文大写开头后面跟着其他非英文字符,最后以回车结束。所以可以根据这个特征从整个试题当中把所有“解析”的内容匹配出来。
    在第一次匹配中,正则交代了要找的对象的结构三个部分构成:头、中、尾。正因为表达式中只有三个部分出现,所以只能捕获头、中、尾三个子字符串。而中间以大写英文字母开头的三个子字符串,在第一次捕获中只能做一个整体;若要分别捕捉出来,必须再进行第二次匹配,分别进行捕获。
    于是乎,表达式"(^解析\s*)([A-D].*?){3}($)",可以捕获三个:“解析”、“A……,B……,C……”,回车(不可见字符)。
    若要对匹配的对象当中的子字符串进行捕获,则要在表达式中具体写出每个需要捕获的子字符串的“特征”(表达式),而且对需要捕获的对象,用“()”括起来。因此,有几组捕获符号(注意:不是分组的括号,分组的括号“)”后有量词“*”或“+”,或前面有?:或?!等),就有几个捕获。
     可以测试:
      "(^解析\s*)([A-D].*?){3}$"——两组括号,两个捕获。
     "(^解析\s+)([A-D].+?)([A-D].+?)([A-D].+?)$"——四组括号,四个捕获。
     "(^解析\s+)([A-D].+?)[A-D].+?([A-D].+?)$"——三组括号,三个捕获。 (其“解析”部分,只需第一、第三子字符串)
    最后总结一下:
    1、若只匹配“字符块”,即不需捕获子字符串,正则表达式可以概括。
    2、若需要捕获子字符串,以备后用,表达式必须具体,特别引起注意的是:若要分别捕获特征相同的几个子字符串,不能用“()*”的“折叠”形式概括的表达这几个子字符串的特点,这样这几个子字符串将合并作为一个整体被捕获,这时必须将它们各自拆开,“重复”表达是正解。如:([A-D].+?)([A-D].+?)([A-D].+?),为了捕获三个不能写成"(^解析\s*)([A-D].*?){3}$"。
    3、分清括号是分组标志还是捕获标志,作捕获标志时,有几组括号,将会有几个捕获。
以上是我这两天求助、探索并经过各网友的帮助和解惑,所获得感悟,也是我对这个帖子的总结。
   
    谢谢各位多次的指教和帮助。
    也希望各位大咖路过时指点,因为我是“正则盲”,理解和感悟可能不对,得到你的拍砖也值得。

TA的精华主题

TA的得分主题

发表于 2024-8-30 23:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
weiyingde 发表于 2024-8-25 06:07
商讨一下:
没有测试,你可能没有测试附件,解析部分只有一个段落,而你出现了三个“\n”,是不是误以为 ...

啰嗦就可以减少可能遇见的错误。三个\n并不是三个段落的意思。而是对应三个选项的解释,从大写字母开始,后面取连续字符,每一个字符的位置都不能是A项这样的描述。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 19:36 , Processed in 0.040755 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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