楼主 kevinchengcw |
Q: 如何用正则替换有规律的字符串时同时去除掉相连的符号? A: 对于一串有规律的字符,例如本例所示范的字符串"第一章,第二章,第八章",我们用正则匹配规则"第[^一二]章"可以匹配到“非每一二章”的文字内容,但是替换掉时会留下前面的逗号,字符串处理结果不够理想,我们可以通过修改匹配规则,将前或后面的符号一同添加到匹配规则中去,这时我们就需要用到“|”这个字符,相当于VBA中的or的用法,为了比较明显显示出前后两段,我们还要用小括号将内容括起来,最终我们写出的匹配条件是:"(\,第[^一二]章)|(第[^一二]章\,)"。 解释如下: 匹配的字符串出现在源字符串中只有三种可能:开头、中间或结尾,当为开头时逗号会在后面,结尾时会在前面,中间时前后都会有,正则的匹配规则中从前到后只做一次匹配,即只要匹配到了一个情况,比如在中间时的“,第八章”,则不会再用这个第八章匹配“第八章,”,所以我们只需要设置一个这样的条件即可达到目的; 当中的“|”字符告诉程序这是两个并行条件的或运算,前后两个小括号中是两个不同的匹配条件,第一个条件匹配逗号在前面的情况,后面的匹配逗号在后面的情况,为防止标点符号等特殊字符直接使用在规则中不被认可的情况,我们在前面为了"\"来强制申明。 验证程序如下:
|
2楼 xyh9999 |
发现K哥一处笔误,应为.Pattern = "(\,第[^一二]章)|(第[^一二]章\,)" |
3楼 liuguansky |
他经常 笔误,我习惯了。 |
4楼 xyh9999 |
哈哈,试着改改: Sub TestRegEx() Dim RegEx As Object Dim a As String Dim b As String Set RegEx = CreateObject("VBSCRIPT.REGEXP") a = "第一章,第二章,第八章" With RegEx .Global = True .Pattern = "第[^一二]章" b = .Replace(a, "") MsgBox b .Pattern = ",?第[^一二]章,?" '哈哈,改成这样也挺好的。 b = .Replace(a, "") MsgBox b End With Set RegEx = Nothing End Sub 根据贪婪匹配原则,如果第N章在中间,你的PATTERN将匹配",第N章,"所以可以在最后面再加一个?,把贪婪变懒惰。 |
5楼 liuguansky |
不行。。如果第N章在开头也不行。哈哈。你的方法不好,最好还是用K哥的PATTERN吧。 |
6楼 xyh9999 |
花花版主怎么在我4楼的帖子上加了以下这么一段话呀?这个好象不太合适吧?!file:///c:/1.jpg “根据贪婪匹配原则,如果第N章在中间,你的PATTERN将匹配",第N章,"所以可以在最后面再加一个?,把贪婪变懒惰。”---花花版主加的! |
7楼 liuguansky |
我点回复的,不知道如何加到编辑中了。 |
8楼 kevinchengcw |
如果是现在,我一定用submatches pattern=",*(第.+?章),*" 那个是全角的逗号 |