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

时间:2013-02-09 21:58:10

标签: regex vba ms-access

我是正则表达式的新手,我正在尝试使用正则表达式验证数据库中的收据编号。

我们的收据可以采用以下格式:

  • 0123456(七位数,不多也不少)
  • 0126456a(一个字母a-z的七位数字)
  • 0126456ab(Manditory七位数,带两个字母a-z)
  • 0126456abc(7位数字,带三个字母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 个答案:

答案 0 :(得分:10)

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

^\d{7}[a-z]{0,3}$
  • \d{7}完全匹配7 digits。您不需要使用\d 7 时间。
  • {0,3}创建一个范围,并匹配前一个模式的0到3次重复,
  • Caret(^)匹配行的开头
  • Dollar($)匹配该行的结尾。

答案 1 :(得分:6)

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

答案 2 :(得分: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次”。