我想做一个自定义 TextBox 控件
此控件多定义了一个 MaskedRegEx 属性
对用户输入的字符进行验证
具体要求如下给 MaskedRegEx 赋值为 \d{4}-\d{4}-\d{4}
即有效字符串应为 4567-8786-9096 这种形式用户在键入字符的某时刻,若文本框中的字符串匹配 MaskedRegEx 前面一部份
(即某时刻文本框的内容为 4、45、456、4567)
则文本框承认用户的输入
若文本框中的内容是456,此时用户接着想在最后输入一个非数字字符,
则文本框拒绝承认用户的输入请问这个控件怎么做?或怎么实现这种需求?(表达不好,不知道各位达人明白我意否?事成之后一手交方法一手交 500 分)谢谢啦。
此控件多定义了一个 MaskedRegEx 属性
对用户输入的字符进行验证
具体要求如下给 MaskedRegEx 赋值为 \d{4}-\d{4}-\d{4}
即有效字符串应为 4567-8786-9096 这种形式用户在键入字符的某时刻,若文本框中的字符串匹配 MaskedRegEx 前面一部份
(即某时刻文本框的内容为 4、45、456、4567)
则文本框承认用户的输入
若文本框中的内容是456,此时用户接着想在最后输入一个非数字字符,
则文本框拒绝承认用户的输入请问这个控件怎么做?或怎么实现这种需求?(表达不好,不知道各位达人明白我意否?事成之后一手交方法一手交 500 分)谢谢啦。
怎么判断某一字符串 3456-7 部分模式匹配 \d{4}-\d{4}-\d{4}
而字符串 3456-7A 非部分模式匹配 \d{4}-\d{4}-\d{4}
MaskEdBox1.Mask = "####-####-####"
End Sub
我要求输入与 TextBox 一样
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
不可能都像这 rainstormmaster 兄样子吧
对某一特定的 MaskedRegEx 都写一个特写的判断函数吧
呵呵
rainstormmaster 可有法子么?
If KeyAscii < 48 Or KeyAscii > 57 Then
FG_Input = False
Else
FG_Input = True
End If
End Function把这个函数放到KEYPRESS事件里判断输入的是否为数字!
如果 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”处于这种“部分匹配”的状态?
关注....
Set IsZipCode = New RegExp
IsZipCode.Pattern = "\d{4}-\d{4}-\d{4}" if IsZipCode.test(text1.text) thenelse
text1.text = oldtext ' oldtext保存了原来的值
beep
endif
我不仅要在最后判断输入的正确性,更要在输入字符的过程中进行判断,这个很重要。有哪个朋友帮决的话
再开N张(N>=5)感谢贴(每贴100分)
每次keydown的时候,把你已经输入的字符和欲比较的正则表达式去匹配一次.
不过这个匹配要匹配该正则表达式的所有可能.
比如说上面说的"\d{4}-\d{4}-\d{4}"
那你就要首先匹配\d,然后是\d{4},然后是\d{4}-,依次类推.
不过这一步不太好作,我的想法是把正则表达式看成一个字符串,我依次取该字符串的前一个字符,前2个字符,前3个字符(当然'\'这样的符号是不算的)作为一个新的正则表达式,以这个表达式去和输入的字符串去匹配看看行不行,这里有个关键就是怎么判断取出来的字符串是一个正则表达式,比如说\d{这样就不是正则表达式拉,不过反正要全部的可能都要比较,就算\d{不匹配也没关系,\d{4}的时候只要匹配就通过拉.但是这样作还是有一个问题,那就是如果表达式是\d{4}这样的话,我在输入3个数字的时候应该是能够匹配的,但是按照之前的方法,就匹配不了了,看看要怎么解决这个问题.
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"同时属于“部分匹配状态”和“最终匹配状态”其实也就是那么一个小小的要求嘛……
有哪个正则表达式库拥有这种功能的
或怎么样自己做一个(我想这个也就算了吧:))
简单一点,加入现在要比较的表达式为"\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},我想,只要解决这个问题就差不多搞定了吧.
我上面的方法跟本“用不着”编程的
你只有在失去焦点的时候对 objRegEx.Match(objRegEx.RegExValidated) 进行判断,如果为真则说明控件中的文本是正在的,也可以在输入字符的过程中对 objRegEx.Match(objRegEx.RegExInputting) 进行判断,如果为真则说明到目前为止控件中的文本还是正确的。我们需要做的是调用 RegEx 对象的方法我属性。但是有时候构造出一个所谓的 RegExInputting 很繁琐。
……
我的方法不需要构造你说的那个东西哦.
反正一个个的搜索字符串,所有可能的正则表达式组合都能找到,该能够用程序解决所有的正则表达式拉.至于那个d{4}转到d{1,4}的情况,我也想了一下,觉得干脆不要在程序里作这个,你在表达正则表达式的时候自己写全应该就行了,也就是说,你自己把d{4}改成d{1,4},应该说这个正则表达式是你事先能够知道的吧,这样就能直接搞定,呵呵.当然了,你如果表达式事先不知道的话,那就算了,只能找另外的方法解决拉.
d{4}和d{1,4}差别是很大的,不能够相互替代。