【问题标题】:Regex not Triggering VBA正则表达式不触发 VBA
【发布时间】:2019-08-01 13:59:52
【问题描述】:

这是我的正则表达式:

    Dim vbRegX As Object, vbRegXMatch As Object
    Set vbRegX = CreateObject("vbscript.regexp")

    With vbRegX
        .Global = True
        .IgnoreCase = True
        .Pattern = "^[a-zA-Z0-9_-]{1,20}$"
    End With

使用它的代码:

    Set vbRegXMatch = vbRegX.Execute(Me.txtProduct.Text)
    If vbRegXMatch.Count = 1 Then
        MsgBox "This string has invalid characters in it. Illegal characters are out side of the following ranges:" & vbNewLine & vbNewling & "a-z or A-Z" & vbNewLine & vbNewling & "0-9, - or _. Please try again."
        Cancel = True
        Me.txtProduct.SetFocus
        Set vbRegXMatch = Nothing
        Set vbRegX = Nothing
        Exit Sub
    End If

此代码使用无效字符触发,但长度大于 20 时不会触发。这是 Regex Buddy 给我的输出:

Dim FoundMatch As Boolean
Dim myRegExp As RegExp
Set myRegExp = New RegExp
myRegExp.Pattern = "^[a-zA-Z0-9_-]{1,20}$"
FoundMatch = myRegExp.Test(SubjectString)

谁能这么好心地指出我错过了什么?

控件的视觉效果:

【问题讨论】:

  • ^[a-zA-Z0-9_-]{1,20}$ 不是在验证 good 输入吗?像If myRegExp.Test(Me.txtProduct.Text) = False Then 一样使用它
  • 长度大于 20 时不会。但它会触发无效字符。
  • 它工作正常 - 请参阅this demo
  • @WiktorStribizew 谢谢,但发生这种情况时它不会触发 - 请参阅编辑后的帖子。
  • If vbRegX.Test("1234555") = False Then 有效,它不会引发任何错误。 If vbRegX.Test("123455=5") = False Then 也有效,它会触发错误。

标签: regex vba ms-access regexbuddy


【解决方案1】:

您的正则表达式匹配 有效 输入。因此,你需要.Test(your_string),如果结果是False,你需要触发一个错误。

替换

Set vbRegXMatch = vbRegX.Execute(Me.txtProduct.Text)
If vbRegXMatch.Count = 1 Then

If vbRegX.Test("1234555") = False Then

另外,由于您期望单个匹配,请使用

.Global = False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 2017-01-18
    • 2022-11-22
    • 2012-01-14
    • 2013-03-28
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多