Regex VBA正则表达式-匹配整个字符串,除非重复模式
我很恼火,我怀疑有一个简单的解决办法,但经过大量的研究,我正在接触社区 我正在使用vba中的regex方法来尝试拆分字符串。我希望整个字符串都与模式匹配,除非字符串中有其他名称。可通过以下方式描述该名称:Regex VBA正则表达式-匹配整个字符串,除非重复模式,regex,vba,Regex,Vba,我很恼火,我怀疑有一个简单的解决办法,但经过大量的研究,我正在接触社区 我正在使用vba中的regex方法来尝试拆分字符串。我希望整个字符串都与模式匹配,除非字符串中有其他名称。可通过以下方式描述该名称: "\s?[a-zA-Z-]*,\s[a-zA-Z]*:\s.*" 我希望该方法在名称匹配后返回所有内容,直到另一个名称匹配为止。这将是理想的结果 我应用该模式的字符串是: 玛丽·梅克:2019年6月14日星期五下午5:00--10:00克莱克佩特罗·弗林斯通,弗雷德:2019年6月14日星期
"\s?[a-zA-Z-]*,\s[a-zA-Z]*:\s.*"
我希望该方法在名称匹配后返回所有内容,直到另一个名称匹配为止。这将是理想的结果
我应用该模式的字符串是:
玛丽·梅克:2019年6月14日星期五下午5:00--10:00克莱克佩特罗·弗林斯通,弗雷德:2019年6月14日星期五上午10:00--4:00克莱克佩特罗·鲍尔斯,肯尼:2019年6月14日星期五下午10:00--11:00
兰迪罗德斯:2019年6月15日星期六上午10:15--11:30服务2019年6月15日星期六上午11:30--12:45下午12:45点击并选择2019年6月15日星期六下午12:45--2:15服务
当我将模式应用于任一字符串时,将返回整个字符串。这不是最优的,因为我试图使用匹配项(0)、匹配项(1)等对名称进行拆分。。因此,第一个字符串应匹配:
(?:\s+)?([a-zA-Z-]+),?(?:\s+)?([a-zA-Z]+):(.+?[A-Z]{3,}).*
我们期望的输出在这三个组中:
([a-zA-Z-]+)
([a-zA-Z]+)
(.+?[A-Z]{3,})
正则表达式电路
可视化正则表达式:
正则表达式2
如果我们希望在名称上拆分它们,我们可以将表达式简化为:
(?:\s+)?([A-Z][a-zA-Z-]+),?(?:\s+)?([A-Z][a-zA-Z]+):
这是一种方法
\b[a-zA-Z-]+,\s?[a-zA-Z]+:*(?=\b[a-zA-Z-]+,\s?[a-zA-Z]+:|$)
扩大
\b
[a-zA-Z-]+
,
\s?
[a-zA-Z]+
:
.*?
(?=
\b
[a-zA-Z-]+
,
\s?
[a-zA-Z]+
:
|
$
)
那么在表达式的末尾,它说。*?(?=\b[a-zA-Z-]+,\s?[a-zA-Z]+:|$)你是说匹配所有的东西,除非?在哪里您在\b和|$之间定义的表达式?如果是,则\b做什么?这是某种文字运算符吗?另外,|美元有什么作用?我以前使用管道“|”来表示模式中的or操作符,但我不清楚“or$”-|$会做什么。再次感谢。将所有内容匹配到,但不包括
(?=\b[a-zA-Z-]+,\s?[a-zA-Z]+:|$)
。这是一个断言,它封装了匹配的第一部分的构造,用于查找下一个匹配的开始。交替的|$
只是为了防止没有下一个匹配项,它匹配字符串的结尾。另外,\b
被称为单词边界,它是一个断言,向后看,然后向前看,并匹配两个字符之间的位置,其中一个是非单词,另一个是单词。实际上,我正在尝试捕获每个匹配字符串中的日期和2+时间字符串。目的是使用逻辑来测试是否有2个以上的时间字符串(应始终以2的倍数出现,因为start1、end1、start2、end2、start3、end3…),end1是否在start2之前,end2是否在start3之前。试图弄清楚时间是否相邻,以了解这是一个班次,多个系列的时间相邻,还是多个班次/天。