![](/img/trans.png)
[英]JavaScript regular expressions to match no digits, whitespace and selected symbols
[英]Letters and digits combination match Regular Expressions
正则表达式匹配对我来说是一个挑战,对你们中的一个人来说可能太容易了。 希望您能帮我解决这个问题。 我需要使用javascript或VB.net在一次测试中测试字符串格式。
该字符串可以有两部分,用一个波浪号字符〜分隔,例如str1〜str2,也可以只有一个没有波浪号字符的部分,例如str1或str2。
Str1是0到8位数字的序列。 当str1的长度为零时,波浪号字符也不存在。
Str2的长度为0到25个字符,其格式必须为字母和数字的组合。 请注意,仅字母或数字不好,但是两者都不能组合。 当str2的长度为零时,波浪号字符不存在。
由于str1〜str2的组合是可选字段,因此str1和str2的长度都可能为零,这会导致str1〜str2的值为空。
例如12345678〜ab2345cdef,12345和ab2345都具有正确的格式,但是12345678〜abcdefgh和12345678〜70934527654的格式不正确,因为第二部分不是字母和数字的组合。
我尝试使用/^([\\d]{4,8})(~)([az\\d]{0,25})$/.test('12345678~ab2345cdef')这样的模式解决方案正确的结果,尽管对于诸如123456或ab1234之类的示例,我可以获得正确的结果。
有什么想法吗?
先感谢您
有正式文档,例如正则表达式和有关精通Lookahead和Lookbehind的教程。
对于您的示例,请尝试以下操作:
var re = /^(\d{4,8})*~?((?=\d*[a-z])(?=[a-z]*\d)[a-z\d]{0,25})*$/;
//testing
re.test('12a345~jh44kjh'); //false. non-digit in 1st part
re.test('12345~jhkjh'); //false. no digits in 2nd part
re.test('12345~123:456'); //false. ":" is not allowed in 2nd part
re.test('12345~123456'); //false. no letters in 2nd part
re.test('12345~abc123456'); //true.
re.test('12345~123456abc'); //true.
re.test('12345~123abc456'); //true.
re.test('12345~abc123def'); //true.
re.test('12345'); //true. 2nd part is optional
re.test('abc12345'); //true. 1st part is optional
一些解释:
^
字符串的开头
$
字符串结尾
(something)
捕获模式
(?=something)
非捕获超前模式
\\d{4,8}
4至8位数字
(?=\\d*[az])
零个或多个数字, 并且前面有一个字母
(?=[az]*\\d)
零个或多个字母和一个数字
[az\\d]{0,25}
允许的符号集:小写字母和数字
这是VB.NET中的解决方案。 模式分为三部分:
第一部分的模式,即1-8位数字
^[0-9]{1,8}$
第二部分的模式,即1-25个字母数字和至少1个字母或数字:
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{1,25}$
两者与波浪号的组合:
^[0-9]{1,8}~(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{1,25}$
这三个模式与|
形成单个正则表达式。
我在代码中包含了一些测试用例。
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim Pattern As String
Dim Parser As Regex
Dim Tests As New List(Of String)
Pattern = "^[0-9]{1,8}$|^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{1,25}$|^[0-9]{1,8}~(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{1,25}$"
Parser = New Regex(Pattern)
Tests.Add("12345678~ab2345cdef")
Tests.Add("12345")
Tests.Add("ab2345")
Tests.Add("12345678~abcdefgh")
Tests.Add("12345678~70934527654")
Tests.Add("12a345~jh44kjh")
Tests.Add("123456789")
Tests.Add("ABab73895zzz")
Tests.Add("aaaaaBBBBBCCCCCdddddZZZZZ1")
Tests.Add("aa0aaBB1BBCC2CCdd3ddZZ4ZZ")
Tests.Add("0~aa0aaBB1BBCC2CCdd3ddZZ4ZZ")
Tests.Add("12345~123___aaa")
Tests.Add("a123~z9")
Tests.Add("1~2a")
Tests.Add("")
For Each Input As String In Tests
Console.WriteLine(String.Format("{0} {1}", Input, Parser.IsMatch(Input)))
Next
Console.ReadKey()
End Sub
End Module
这是我的解决方案:
/^(\d{1,8}|(?=\d*[a-z])(?=[a-z]*\d)[a-z\d]{2,25}|\d{1,8}~(?=\d*[a-z])(?=[a-z]*\d)[a-z\d]{2,25})$/
\\d{1,8}
从1到8个数字
(?=\\d*[az])(?=[az]*\\d)[az\\d]{2,25}
从2到25个字母
\\d{1,8}~(?=\\d*[az])(?=[az]*\\d)[az\\d]{2,25}
通过〜连接上述情况
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.