3

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

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

  • 0123456(Manditory 七位数,不多不少)
  • 0126456a(强制七位数字和一个字母 az)
  • 0126456ab(强制性七位数字,两个字母 az)
  • 0126456abc(强制七位数字,三个字母 az)

我尝试过使用一堆不同的正则表达式组合,但似乎都不起作用。现在我有:

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

但这允许超过 7 个数字,并且允许超过 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
4

3 回答 3

10

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

^\d{7}[a-z]{0,3}$
  • \d{7}完全匹配7 digits。您不需要为此使用\d7 次。
  • {0,3}创建一个范围,并匹配前面模式的 0 到 3 次重复,
  • Caret(^)匹配行的开头
  • Dollar($)匹配行尾。
于 2013-02-09T21:59:35.773 回答
6

^(\d){7}[a-z]{0,3}$可能运作良好。^和将$分别匹配行的开始和结束。

于 2013-02-09T22:01:44.880 回答
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}$

where{7}表示“正好 7 次”,{0,3}表示“0-3 次”。

于 2013-02-09T22:05:02.820 回答