我想做一个自定义 TextBox 控件
此控件多定义了一个 MaskedRegEx 属性
对用户输入的字符进行验证
具体要求如下给 MaskedRegEx 赋值为 \d{4}-\d{4}-\d{4}
即有效字符串应为 4567-8786-9096 这种形式用户在键入字符的某时刻,若文本框中的字符串匹配 MaskedRegEx 前面一部份
(即某时刻文本框的内容为 4、45、456、4567)
则文本框承认用户的输入
若文本框中的内容是456,此时用户接着想在最后输入一个非数字字符,
则文本框拒绝承认用户的输入请问这个控件怎么做?或怎么实现这种需求?(表达不好,不知道各位达人明白我意否?事成之后一手交方法一手交 500 分)谢谢啦。

解决方案 »

  1.   

    在TextBox的Change事件中检查内容是否合法,如果合法就保存一份副本,如果不合法就用副本替换文本框中的内容。否则你就需要处理KeyPress事件,并子类化处理用户粘贴引用中的Microsoft VBScript Regular Expressions可以处理正则表达式
      

  2.   

    我的问题正是对于任意给出一个正规表达模式,如 \d{4}-\d{4}-d{4}
    怎么判断某一字符串 3456-7 部分模式匹配 \d{4}-\d{4}-\d{4}
    而字符串 3456-7A 非部分模式匹配 \d{4}-\d{4}-\d{4}
      

  3.   

    用MaskEdBox(工程 部件 Microsoft Masked Edit Control 6.0)Private Sub Form_Load()
        MaskEdBox1.Mask = "####-####-####"
    End Sub
      

  4.   

    非也
    我要求输入与 TextBox 一样
      

  5.   

    就是解析字串,类似下面这样:
    Option ExplicitPrivate Sub Command1_Click()
        Debug.Print isPP(Text1.Text)
    End SubPrivate Function isPP(ByVal s As String) As Boolean
        Dim arr
        arr = Split(s, "-")
        Dim i As Long, j As Long
        Dim temp As String
        Dim arrs As String
        arrs = "0123456789"
        i = UBound(arr)
        If i > 2 Then
            isPP = False
            Exit Function
        Else
             For j = 0 To UBound(arr)
                 i = Len(arr(j))
                 If i > 4 Then
                     isPP = False
                     Exit Function
                 Else
                     For i = 1 To Len(arr(j))
                         temp = Mid(arr(j), i, 1)
                         If InStr(1, arrs, temp) < 1 Then
                           isPP = False
                           Exit Function
                          Else
                            isPP = True
                          End If
                     Next
                End If
            Next
            isPP = True
        End If
    End Function
      

  6.   

    我的 MaskedRegEx 可以有无数个
    不可能都像这 rainstormmaster 兄样子吧
    对某一特定的 MaskedRegEx 都写一个特写的判断函数吧
    呵呵
    rainstormmaster 可有法子么?
      

  7.   

    在你的控件的按键事件中调用rainstormmaster的函数吧
      

  8.   

    Public Function FG_Input(KeyAscii As Integer) As Boolean
        If KeyAscii < 48 Or KeyAscii > 57 Then
            FG_Input = False
        Else
            FG_Input = True
        End If
    End Function把这个函数放到KEYPRESS事件里判断输入的是否为数字!
      

  9.   

    各位,我想要的是做一个自定义控件
    如果 MaskedRegEx 设为 \b[A-Z0-9._-]+@[A-Z0-9._-]+\.[A-Z]{2,4}\b (email address)呢
    如果 MaskedRegEx 设为 [-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)? (floating point number) 尼
    如果 ...上面的函数能适应用户所有的 MaskedRegEx 吗??有一点很重要!
    不是当所有的字符都输入完毕后才对其进行验证
    而是在输入字符的过程中对其进行验证
    只要某时刻(用户输入的)字符串是一有效串的前缀就算是验证通过了
    上面一句话可以这样理解
    比如我要用“\b[A-Z0-9._-]+@[A-Z0-9._-]+\.[A-Z]{2,4}\b”对用户输入的 email address 进行有效验证
    某时刻文本框内的内容为“CNSuper@CNSuper”(此时字符串当然没有模式匹配上面的 MaskedRegEx)
    若用户想在内容末尾输入一人非法字符(如:“@”)
    因“CNSuper@CNSuper@”非模式匹配“\b[A-Z0-9._-]+@[A-Z0-9._-]+\.[A-Z]{2,4}\b”
    所以字符“@”不会被接受
    虽然“CNSuper@CNSuper”并没有模式匹配 MaskedRegEx,但是却是某一有效验证串的前缀
    怎么决定“CNSuper@CNSuper”处于这种“部分匹配”的状态?
      

  10.   

    在asp中可用正则表达式验证,那么是否有这样的控件或库呢?
    关注....
      

  11.   

    在text中的keydown事件中判断
    Set IsZipCode = New RegExp 
    IsZipCode.Pattern = "\d{4}-\d{4}-\d{4}" if IsZipCode.test(text1.text) thenelse
       text1.text = oldtext ' oldtext保存了原来的值
       beep
    endif
      

  12.   

    还是不能达到我想要的要求。
    我不仅要在最后判断输入的正确性,更要在输入字符的过程中进行判断,这个很重要。有哪个朋友帮决的话
    再开N张(N>=5)感谢贴(每贴100分)
      

  13.   

    我到是有个想法,就是不知道能不能行得通.
    每次keydown的时候,把你已经输入的字符和欲比较的正则表达式去匹配一次.
    不过这个匹配要匹配该正则表达式的所有可能.
    比如说上面说的"\d{4}-\d{4}-\d{4}" 
    那你就要首先匹配\d,然后是\d{4},然后是\d{4}-,依次类推.
    不过这一步不太好作,我的想法是把正则表达式看成一个字符串,我依次取该字符串的前一个字符,前2个字符,前3个字符(当然'\'这样的符号是不算的)作为一个新的正则表达式,以这个表达式去和输入的字符串去匹配看看行不行,这里有个关键就是怎么判断取出来的字符串是一个正则表达式,比如说\d{这样就不是正则表达式拉,不过反正要全部的可能都要比较,就算\d{不匹配也没关系,\d{4}的时候只要匹配就通过拉.但是这样作还是有一个问题,那就是如果表达式是\d{4}这样的话,我在输入3个数字的时候应该是能够匹配的,但是按照之前的方法,就匹配不了了,看看要怎么解决这个问题.
      

  14.   

    谢谢 danielpan(连) 的参与与帮助。danielpan(连) 的意思我可以归纳为下面的方法:给出两个属性:
    RegExValidated - 最终(如失去焦点后)可以接受的表达式
    RegExInputting - 在输入过程中可以接受的表达式对于上面那种情况
    可以分别给予这两个属性分别赋值为
    RegExValidated = "\d{4}-\d{4}-\d{4}"
    RegExInputting = "^\d{1,4}(-\d{1,4}(-\d{1,4})?)?$"下面打上勾的是通过 RegExInputting 验证的输入字符串表达式01 - "1" √
    02 - "1d" ×
    03 - "12" √
    04 - "12x" ×
    05 - "125" √
    06 - "125p" ×
    07 - "1258" √
    08 - "1258-" ×
    09 - "12588" ×
    10 - "1258-x" ×
    11 - "1258-123-" ×
    12 - "1258-1237-383" √对于上面一个很简单的 RegExValidated,构造出来的 RegExInputting 已经是这么的……,要是 RegExValidated 很复杂的话,自己构造一个所谓的 RegExInputting 表达式,那将是多么的繁琐。因此我最最最最最最想要的是:
    只根据一个给出的 RegExValidated,可以知道匹配的“状态”,如
    "1"
    "12"
    "123"
    "1234"
    "1234-"
    ...
    "1234-5678-901"
    等属于“部分匹配状态”
    "1234-5678-9012"同时属于“部分匹配状态”和“最终匹配状态”其实也就是那么一个小小的要求嘛……
    有哪个正则表达式库拥有这种功能的
    或怎么样自己做一个(我想这个也就算了吧:))
      

  15.   

    呵呵,你作的似乎比我进一步,但是写程序不好解决,我本来的想法是这样的.
    简单一点,加入现在要比较的表达式为"\d{4}-\d{4}"
    那么我每次输入一个字符后要比较的正则表达式为(有多个RegExInputting):
    "\"
    "\d"
    "\d{"
    "\d{4"
    "\d{4}"    //这个是个正确的表达式,上面的都不是哦
    "\d{4}-"   //这个也是
    "\d{4}-\"
    "\d{4}-\d"
    "\d{4}-\d{"
    "\d{4}-\d{4"
    "\d{4}-\d{4}"  //这个是表达式
    把你输入的和上面所有的比较,只要其中有一个表达式能够匹配则说明你现在是部分匹配,全不匹配说明不匹配.
    这样作看上去很麻烦,很笨,但是有一点好处,就是方便写成代码,不是吗?一个while循环就搞定了.关键就是我上面说的那个问题,也就是\d{4}如何转换成\d{1,4},我想,只要解决这个问题就差不多搞定了吧.
      

  16.   

    呵呵
    我上面的方法跟本“用不着”编程的
    你只有在失去焦点的时候对 objRegEx.Match(objRegEx.RegExValidated) 进行判断,如果为真则说明控件中的文本是正在的,也可以在输入字符的过程中对 objRegEx.Match(objRegEx.RegExInputting) 进行判断,如果为真则说明到目前为止控件中的文本还是正确的。我们需要做的是调用 RegEx 对象的方法我属性。但是有时候构造出一个所谓的 RegExInputting 很繁琐。
    ……
      

  17.   

    所以阿,你没发现吗?
    我的方法不需要构造你说的那个东西哦.
    反正一个个的搜索字符串,所有可能的正则表达式组合都能找到,该能够用程序解决所有的正则表达式拉.至于那个d{4}转到d{1,4}的情况,我也想了一下,觉得干脆不要在程序里作这个,你在表达正则表达式的时候自己写全应该就行了,也就是说,你自己把d{4}改成d{1,4},应该说这个正则表达式是你事先能够知道的吧,这样就能直接搞定,呵呵.当然了,你如果表达式事先不知道的话,那就算了,只能找另外的方法解决拉.
      

  18.   

    -- 至于那个d{4}转到d{1,4}的情况……在表达正则表达式的时候自己写全应该就行了
    d{4}和d{1,4}差别是很大的,不能够相互替代。