字母和数字组合匹配正则表达式

时间:2016-07-07 22:51:12

标签: javascript regex vb.net

我遇到了正则表达式匹配的挑战,对于你们中的一个人来说可能太容易了。我希望你能帮我解决这个问题。 我需要使用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,但是没有产生正确的结果。

请问好吗?

提前谢谢

3 个答案:

答案 0 :(得分:1)

有正式文件,例如Regular Expressions和有关Mastering Lookahead and 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*[a-z])零个或多个数字前面的字母
(?=[a-z]*\d)零个或多个字母前面的数字
[a-z\d]{0,25}允许符号集:小写字母和数字

答案 1 :(得分:0)

这是VB.NET的解决方案。该模式分为三部分:

第一部分的模式,即1-8位数

^[0-9]{1,8}$

第二部分的模式,即1-25个字母数字,至少有一个字母或数字:

^(?=.*[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

答案 2 :(得分:0)

这是我的解决方案:

<

<从1到8个数字

> 2到25个字母

/^(\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})$/ 通过〜

加入上述案例

测试:https://jsfiddle.net/s2g0b6v9/2/