ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 求一句第二次正确匹配的正则表达式:只匹配选枝

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-4-30 12:14 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 weiyingde 于 2020-5-6 16:59 编辑

正则表达式:.Pattern = "[A-Z]+[\..]((?!([A-Z][\..]|【解析】[^\rA-Z\..]+\r)).)+"  
问题:误配了【解析】文本段内容
要求:修改上面的正则表达式,使之只准确匹配选择题的选枝。
代码如下:
Sub 误配了解析()
    Dim mt, mk, oRng As Range, n&, m&, str$, TT$
    Dim rg As Range, arr(), x%, d As Object, k&, a
    Set d = CreateObject("Scripting.Dictionary")
    str = Replace(ActiveDocument.Content, Chr(7), "")
    With CreateObject("vbscript.regexp")
        .Global = True: .IgnoreCase = False: .MultiLine = True
        .Pattern = "^\d+[^\r]*[\((]([A-Z])[\))]\r(?:(?!^\d+[^\r]+\r).)+"
        For Each mt In .Execute(str)
           fst = mt.firstindex
           lgh = mt.Length
           Set oRng = ActiveDocument.Range(fst, fst + lgh)
           sr1 = mt.submatches(0) '获取答案
         
          '下面的要求是:
          '只匹配选枝,不匹配【解析】一段的任何文本。
           .Pattern = "[A-Z]+[\..]((?!([A-Z][\..]|【解析】[^\rA-Z\..]+\r)).)+"
           TT = Replace(oRng.Text, Chr(7), "")
           For Each mk In .Execute(TT)
               MsgBox mk
           Next
        Next
    End With
End Sub

求正确匹配选枝.rar

24.14 KB, 下载次数: 15

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-30 15:04 | 显示全部楼层
求大侠一助,在线等候,你的援手。

TA的精华主题

TA的得分主题

发表于 2020-4-30 22:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 sylun 于 2020-4-30 22:47 编辑

可试试在第2个.Pattern行前加两行,即先删除解析部分:
.Pattern = "【解析】[^\r]+"
TT = .Replace(oRng.Text, "")

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-1 06:36 | 显示全部楼层
谢谢关注和一贯以来的帮助,谢谢。
但这个解决方案行不通。为什么?
因为本贴其实是http://club.excelhome.net/thread-1531420-1-1.html的跟帖。
目的是要解决“【解析】”部分的问题。如果直接删除了‘【解析】’部分,下文没戏了……岂不南辕北辙?
为什么不继续跟帖?因为前面那个帖子之所以没有达到预期目的,症结就在于第二个正则表达式有问题。
说白了,那个贴其实只适合没有“【解析】”的题目。
如果能够修改这句表达式,所有的问题或许就能迎刃而解……
现在只能一步一步的试验了。

TA的精华主题

TA的得分主题

发表于 2020-5-1 13:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
首先,我对正则没有深入研究过,平时用find查找替换或函数处理文本的多。不是很清楚楼主的整体处理思路,我是这样想的:从数据的角度看,每道选择题主要包括编号、题干、选项、答案和解析等项,其数据用二维数组应该可以保存。源文件只是一个普通文档,要转换成数据,在提取到每道题的完整文本的基础上,最好能分析出每道题中各项内容,包括选项部分中各个选项的内容,然后再根据对选项的随机重排来对应调整答案及解析(如果有)的内容。因内容在调整前后,除了编号、选项与解析文本中的分项次序,以及作为选项的字母可能不同外,其余都是不应变动的。所以,感觉问题的关键就是大写字母的前后对应调整。因此,在处理选项前,先将解析文本剔除或忽略是正常思路。这并不影响后续对解析文本的相应处理。这是我之前处理的基本思路。我想这样的思路是成立的,至于当中有没有盲点,那是另一回事。
至于楼主为何要在程序中返回到Range对象处理,不知是否文档中存在其他不宜用字符串处理的元素,如表格,图片甚至图形对象等,或者原题中有特别的段落格式或字符格式。

TA的精华主题

TA的得分主题

发表于 2020-5-1 14:18 | 显示全部楼层
证明一个表达式没法直接表达效果,你就别多想了。还是先删除解析段落吧,然后表达式[A-D][..].+?(?=[A-D\n]),你那个写复杂了可能

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-1 18:28 | 显示全部楼层
yian123 发表于 2020-5-1 14:18
证明一个表达式没法直接表达效果,你就别多想了。还是先删除解析段落吧,然后表达式[A-D][..].+?(?=[A-D\n ...

我的目的是要解析中序号随着选枝的随机变动做相应的调整,如果删除了,请问,还能实现这个目的吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-1 20:10 | 显示全部楼层
本帖最后由 weiyingde 于 2020-5-2 14:30 编辑

谢谢指教,谢谢回复。
我的思路如下
1、首先说一下待处理的文档特征:
A.每道题的题干自成一段,都以阿拉伯数字开头,以括号夹一个大写英文字母结束。
B.每道题有四个或以上的选项,每个选项都以大写英文字母为序号,每个选项视文本长短而安排段落,长的一项一段,短的两项或多项一段。
C.【解析】或有或无,难的题目有,容易的自然省略。
2、对试题各选项进行随机的实现的思路是:
A.用正则表达式通过匹配遍历所有题目,当然每个匹配项目,包括题干、答案、选项,【解析】或有或无。
B.通过正则获取每道题的地址,以该地址所指向的文本范围为每一次操作区块。在每道题的题枝在随机的同时,使该道题的答案和【解析】(通过正则的test判断,若有则变动)中出现的大写英文字母(实际上是每项选枝的题号)做相应的联动变化。
如此从前而后一个一个题目进行处理。
为什么要以一个题目为单位进行区块处理呢?
因为每道题的答案、选枝(选项)、解析之间有直接联系,选枝一变,其他两项(或一项)就会相应而变,它们之间的关系十分密切。这三者只能在同一个循环的同一区块处理。如果异步处理,会达不到预期效果。

TA的精华主题

TA的得分主题

发表于 2020-5-1 23:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
weiyingde 发表于 2020-5-1 20:10
谢谢指教,谢谢回复。
我的思路如下
1、首先说一下待处理的文档特征:

其实我也是这样处理的,只是处理过程主要针对数组变量。既然已提取了每道题的完整文本内容,并可以区分每道题中各部分的内容,那么随机生成一组序数后即可确定选项序列的前后对应关系(如前帖22楼的k变量),这样即可依次修改各项的大写字母,当然其中的选项变成文档文本时仍需依次排序。也就是这些都可以对数组变量预先处理好再搬到文档中,不容易混乱。如有需要,也可以将数组各项分别替换原文档对应的文本,如果可是纯文本的话,可以直接在新文档中按需导出一组随机重排的题目。
对于楼主所说的第二个正则表达式,我想其虽然可匹配至解析之前的字符,但因解析部分是非捕获的,其下一个匹配会从解析字符开始,这样也许可以解释其可匹配解析文本中含大写字母带点的字符串。基于这样考虑,将其预先清除是合理的。既然可以清除,自然之前已经提取解析文本了。
至于同一段落多个选项的情形,感觉以若干个空格分隔的排版方式不如制表符分隔方便,如从对齐的角度考虑,从查找与匹配角度看更是如此。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-2 15:43 | 显示全部楼层
本帖最后由 weiyingde 于 2020-5-2 17:05 编辑

谢谢回复。我正在啃读你的http://club.excelhome.net/thread-1531420-1-1.html六楼的帖子,你用了一个主程序和3个函数实现了有【解析】的题目的随机。测试,没有问题。
在未卒读并弄懂大侠代码之前,我还有个要求,不知能否改进你的代码,提高它的兼容性:
1、可以适应选项:一项一段或多项一段两种情况;
2、可以灵活处理有否【解析】两种情况:有【解析】就调整,无解析就飘过。也就是说无论有无【解析】都能参与随机。
盼望能在我弄懂大侠代码之前,先睹为快。
谢谢你。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-28 04:51 , Processed in 0.055634 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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