Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex VBA正则表达式-匹配整个字符串,除非重复模式_Regex_Vba - Fatal编程技术网

Regex VBA正则表达式-匹配整个字符串,除非重复模式

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日星期

我很恼火,我怀疑有一个简单的解决办法,但经过大量的研究,我正在接触社区

我正在使用vba中的regex方法来尝试拆分字符串。我希望整个字符串都与模式匹配,除非字符串中有其他名称。可通过以下方式描述该名称:

"\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)等对名称进行拆分。。因此,第一个字符串应匹配:

  • 玛丽·梅克:2019年6月14日星期五下午5:00--10:00克莱克佩特罗
  • 弗林斯通,弗雷德:2019年6月14日星期五上午10:00—下午4:00克莱克佩特罗
  • 肯尼鲍尔斯:2019年6月14日星期五晚上10:00--11:00
  • 但是,第二个字符串应该与整个字符串匹配(与当前一样),因为该字符串中没有第二个名称

    如何解决此问题?

    RegEx 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之前。试图弄清楚时间是否相邻,以了解这是一个班次,多个系列的时间相邻,还是多个班次/天。