如何格式化此VBA RegExp?

时间:2017-07-06 12:53:53

标签: regex vba

目前从某些.xlsx文件的名称中获取具有以下格式的名称:

  • IT名称姓氏-VP名称姓氏 - 报告 - 月份
  • IT-Name LastName - 报告 - 月份年
  • 名称LastName-Name LastName - Month Year
  • 姓名姓氏 - 报告 - 月份年

依旧...... 我可以轻松地将名称与 - report - month year和-vp部分分开,并将它们放入LastName,Name格式。

我目前遇到的问题是,其中一些名称中会有破折号。例如Bob Smith-Jones这样的东西。

我是使用VBA和RegEx的新手,这是我用来在姓名LastName []中分隔名称的模式?[ - ] []?姓名LastName格式。< / p>

'                      Name         LastName       -        Name            LastName
objRegEx2.Pattern = "([a-zA-Z]*)[ ]([a-zA-Z]*)[ ]?[-]?[ ]?(([a-zA-Z]*)[ ]([a-zA-Z]*))?"
newFile = objRegEx2.Replace(newFile, "$2, $1, $5, $4")
'To remove ", , " when there is only one name
newFile = Replace(newFile, ", , ", "")

有没有办法让Bob Smith-Jones格式的名字变成Smith-Jones,Bob格式?目前他们最终采用Smith,BobJones格式

1 个答案:

答案 0 :(得分:2)

你离我不远 - 你可以使用:

([a-zA-Z]+)[ ]([a-zA-Z\-]+)( \- )([a-zA-Z]+)[ ]([a-zA-Z\-]+)

请注意,您需要使用-转义“LastName”部分中的\,因为您可以看到-是一个特殊的正则表达式字符。

要在名称之间获取,,我将replace子句更新为"$2, $1 $3 $5, $4"

如果您想匹配Billy-Bob Smith以及Bob Smith-Jones等名称,可以将额外的\-添加到模式的名字部分,如:

([a-zA-Z\-]+)[ ]([a-zA-Z\-]+)( \- )([a-zA-Z\-]+)[ ]([a-zA-Z\-]+)

测试代码(在Excel中):

Option Explicit

Sub Test()

    Dim objRegex As Object
    Dim strPattern As String
    Dim strInput As String
    Dim strOutput As String

    strPattern = "([a-zA-Z\-]+)[ ]([a-zA-Z\-]+)( \- )([a-zA-Z\-]+)[ ]([a-zA-Z\-]+)"
    Set objRegex = CreateObject("VBScript.RegExp")
    objRegex.Pattern = strPattern

    strInput = "Billy-Bob Smith - Terry Smith-Jones - July 2017"
    strOutput = objRegex.Replace(strInput, "$2, $1 $3 $5, $4")

    Debug.Print strOutput

End Sub

给出:

Smith, Billy-Bob  -  Smith-Jones, Terry - July 2017