【问题标题】:VBA Regex replace loopVBA 正则表达式替换循环
【发布时间】:2019-02-28 04:21:33
【问题描述】:

我遇到了用于票务系统格式的正则表达式替换循环问题。

我正在测试一段代码,它将正则表达式匹配票号的特定格式。票号的格式应为“INC01234567”(最多 8 位数字)。 “INC”可以是可选的,这样用户只需输入结束数字(即 1234567),循环将添加额外的“0”以使数字数量最多为 8 位。但是,目前,我遇到了一个数学逻辑问题,如果您输入完整的票号,它会在结果中添加一个太多的 0。

Sub Incident()
Dim sInc As String  'Incident Number Field
Dim strPattern As String: strPattern = "^(?:INC|NC|C)?([0-9]{1,8}$)"
Dim strReplaceINC As String: strReplaceINC = "$1"
Dim regEx As New RegExp
Dim strInput As String
Dim IncResult As Boolean

Do
    If strPattern <> "" Then
        
        strInput = inputbox("Input Incident Number", "Ticket Number")
        
        If strInput = vbNullString Then
            Exit Sub
        End If
        
        IncResult = False
    
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = True
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            sInc = regEx.Replace(strInput, strReplaceINC)
            Dim L As Integer: L = Len(sInc)
            Do
                sInc = "0" & sInc
                L = L + 1
            Loop While L <= 8
            sInc = "INC" & sInc
            IncResult = True
            'sInc = strInput
        Else
            MsgBox ("Please input a valid ticket number format")
            IncResult = False
        End If
    End If
    
Loop While IncResult = False
MsgBox (sInc)
End Sub

【问题讨论】:

  • 基于您的代码,由于您的“Do While”循环,您总是在结果中插入一个“0”,对吗?如果是这样,为什么不使用 For 循环,条件是结果少于 8 个字符?
  • 总是以INC开头吗?

标签: regex vba outlook


【解决方案1】:

循环是不必要的开销,只需使用Format()

全部替换:

Dim L As Integer: L = Len(sInc)
Do
    sInc = "0" & sInc
    L = L + 1
Loop While L <= 8
sInc = "INC" & sInc

有了这个:

sInc = "INC" & Format(sInc, "00000000")

【讨论】:

    【解决方案2】:

    您正在检查循环结束时的条件,这意味着循环将始终至少运行一次,无论 sInc 的长度如何。

    只需替换:

    Do
        sInc = "0" & sInc
        L = L + 1
    Loop While L <= 8
    

    与:

    While L < 8
        sInc = "0" & sInc
        L = L + 1
    Wend
    

    【讨论】:

    • 这在技术上可行,但根本不需要循环。
    • @ValonMiller 你说得对,我更多的回答是向 OP 展示他们的代码有什么问题,并为这个问题提供最简单的解决方案。
    • @JoshEller 感谢其他变体,您和 Valon 都提供了很好的解决方案。
    • While L &lt; 8...Wenddeprecated 支持 Do While L &lt; 8 ... Loop
    【解决方案3】:

    正则表达式 "^(?:INC|NC|C)?([0-9]{1,8}$)" 匹配 8 位票号 012345678,不是吗?所以If regEx.Test(strInput) Then 将是真的,do..loop 至少会在它中断之前按时运行

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      相关资源
      最近更新 更多