7位数字后面可选3个字母的正则表达式

3
我对正则表达式还不熟悉,我正在尝试使用正则表达式验证我们数据库中的收据号码。
我们的收据可以采用以下格式:
  • 0123456(必须是七位数字,不能多也不能少)
  • 0126456a(必须是七位数字和一个小写字母a-z)
  • 0126456ab(必须是七位数字和两个小写字母a-z)
  • 0126456abc(必须是七位数字和三个小写字母a-z)
  • 我已经尝试了许多不同的正则表达式组合,但没有一种能够正常工作。目前我使用的是:
    (\d)(\d)(\d)(\d)(\d)(\d)(\d)([a-z])?([a-z])?([a-z])?
    

    但是这允许超过七位数字,并允许超过3个字母。

    以下是我在Access 2010中的VBA函数,将验证表达式:

    Function ValidateReceiptNumber(ByVal sReceipt As String) As Boolean
    
        If (Len(sReceipt) = 0) Then
            ValidateReceiptNumber = False
            Exit Function
        End If
    
        Dim oRegularExpression     As RegExp
    
    '   Sets the regular expression object
        Set oRegularExpression = New RegExp
    
        With oRegularExpression
    '   Sets the regular expression pattern
            .Pattern = "(\d)(\d)(\d)(\d)(\d)(\d)(\d)([a-z])?([a-z])?([a-z])?"
    
    '   Ignores case
            .IgnoreCase = True
    
    '       Test Receipt string
            ValidateReceiptNumber = .Test(sReceipt)
    
        End With
    End Function
    
    3个回答

    10

    你可能需要在末尾使用锚点。此外,你的正则表达式可以简化为:-

    ^\d{7}[a-z]{0,3}$
    
    • \d{7} 匹配恰好 7 个数字。你不需要使用 \d 进行 7 次匹配。
    • {0,3} 创建一个范围,匹配前面模式的 0 到 3 次重复。
    • Caret(^) 匹配行的开头。
    • Dollar($) 匹配行的结尾。

    6

    ^(\d){7}[a-z]{0,3}$ 可能很有效。 ^$ 分别匹配行的开头和结尾。


    3

    您可能希望通过使用锚点来确保匹配整个字符串。

    ^(\d)(\d)(\d)(\d)(\d)(\d)(\d)([a-z])?([a-z])?([a-z])?$
    

    您可以简化正则表达式。首先,您不需要所有那些括号。
    ^\d\d\d\d\d\d\d[a-z]?[a-z]?[a-z]?$
    

    此外,您可以使用有限的重复来避免重复自己。
    ^\d{7}[a-z]{0,3}$
    

    {7} 表示 '正好 7 次',{0,3} 表示 '0-3 次'。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接