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

时间:2019-06-03 22:15:19

标签: regex vba

我很烦-我怀疑有一个简单的解决方案,但是经过大量研究后,我正在向社区伸出援手。

我在vba中使用regex方法来尝试拆分字符串。我要发生的是,除非字符串中没有其他名称,否则整个字符串将与模式匹配。名称可以通过以下方式描述:

"\s?[a-zA-Z-]*,\s[a-zA-Z]*:\s.*"

我希望该方法将在名称匹配后返回所有内容-直到另一个名称匹配为止。这将是理想的结果。

我要应用该模式的字符串是:

玛丽(Meck):星期五6/14/2019 5:00 PM-10:00 PM CLERKPETRO弗林斯通,弗雷德:星期五6/14/2019 10:00 AM-4:00 PM CLERKPETRO Powers,肯尼:星期五6/14/2019 10:00 PM-11:00 PM

罗德,兰迪:2019年6月15日星期六10:15 AM-11:30 AM SERVCNTR 2019年6月15日星期六11:30 AM-12:45 PM单击并取货2019年6月15日星期六12 :45 PM-2:15 PM SERVCNTR

当我将模式应用于任一字符串时,将返回整个字符串。这不是最佳选择,因为我正尝试使用matchs(0),matches(1)等对名称进行拆分。因此第一个字符串应与以下项匹配:

  1. Meck,Mary:星期五6/14/2019 5:00 PM-10:00 PM CLERKPETRO
  2. 弗雷斯顿(Flinstone),弗雷德(Flinstone):星期五6/14/2019 10:00 AM-4:00 PM CLERKPETRO
  3. Powers,Kenny:2019年6月14日星期五10:00 PM-11:00 PM

但是第二个字符串应该与整个字符串匹配(因为它当前是这样),因为该字符串中没有第二个名字。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

这是一种实现方法

\b[a-zA-Z-]+,\s?[a-zA-Z]+:.*?(?=\b[a-zA-Z-]+,\s?[a-zA-Z]+:|$)

https://regex101.com/r/ccj6ea/1

扩展

 \b 
 [a-zA-Z-]+ 
 , 
 \s? 
 [a-zA-Z]+ 
 : 
 .*? 
 (?=
      \b 
      [a-zA-Z-]+ 
      , 
      \s? 
      [a-zA-Z]+ 
      : 
   |  
      $ 
 )

答案 1 :(得分:0)

RegEx 1

我猜想我们希望捕获问题中列出的字符串的三个部分,如果可能的话,我们将通过略微修改原始表达式来开始:

(?:\s+)?([a-zA-Z-]+),?(?:\s+)?([a-zA-Z]+):(.+?[A-Z]{3,}).*

我们期望的输出在以下三个组中:

([a-zA-Z-]+)
([a-zA-Z]+)
(.+?[A-Z]{3,})

Demo

enter image description here

RegEx电路

jex.im可视化正则表达式:

enter image description here

RegEx 2

如果我们希望将它们拆分为名称,可以将表达式简化为:

(?:\s+)?([A-Z][a-zA-Z-]+),?(?:\s+)?([A-Z][a-zA-Z]+):

Demo 2