正则匹配含句号的字母开头子串失败,如何修正?
解决正则匹配大写字母开头子串的问题
我来帮你搞定这个正则的问题!你之前用的([A-Z].*?)(?=[A-Z])之所以抓不到F.01,核心原因是正向预查(?=[A-Z])要求每个匹配项后面必须跟着大写字母,但F.01是字符串的最后一段,后面没有大写字母,所以自然被漏掉了。另外,.*?虽然是惰性匹配,但这里我们更需要明确允许匹配的字符范围(比如句号),避免不必要的匹配。
调整后的正则表达式
直接用这个正则就能完美匹配你要的所有子串:
([A-Z][A-Z0-9.]*)(?=[A-Z]|$)
正则拆解
[A-Z]:匹配每个子串开头的大写字母,严格符合“大写字母开头”的要求[A-Z0-9.]*:匹配后续的合法字符——大写字母、数字、句号,*表示可以匹配零个或多个,这样就能包含F.01里的句号和小数部分(?=[A-Z]|$):把正向预查的逻辑调整为“要么后面跟着大写字母(下一个子串的开头),要么到字符串结尾”,这样最后一段F.01就能被正常捕获了
VBA中使用的示例代码
你可以直接把这段代码放到VBA里测试,遍历所有匹配结果:
Sub MatchCNCStrings() Dim regEx As Object Dim matches As Object Dim matchItem As Object Dim inputText As String inputText = "G71P100Q110U0W0F.01" ' 创建正则对象 Set regEx = CreateObject("VBScript.RegExp") regEx.Pattern = "([A-Z][A-Z0-9.]*)(?=[A-Z]|$)" regEx.Global = True ' 开启全局匹配模式 ' 执行匹配操作 Set matches = regEx.Execute(inputText) ' 遍历并输出所有匹配结果 For Each matchItem In matches Debug.Print matchItem.SubMatches(0) Next matchItem End Sub
运行这段代码后,VBA的立即窗口会输出:
G71 P100 Q110 U0 W0 F.01
完全符合你的预期需求!
内容的提问来源于stack exchange,提问作者tjb1
相关产品推荐
相关产品推荐

