2016-07-07 435 views
0

我对正则表达式匹配有一个挑战,对于你们中的一个来说可能太简单了。我希望你能帮助我解决这个问题。 我需要使用javascript或VB.net一次性测试字符串格式。字母和数字的组合匹配正则表达式

该字符串可能有两个部分用一个波浪符char〜分开,如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,但这并没有产生正确的结果。

有什么想法吗?

预先感谢您

+0

哪个测试字符串没有产生预期的结果?你遇到了什么错误?查看你的场景,你将需要在同一个(使用|)上结合3个不同的正则表达式来匹配不同的可能性:一个匹配只有str1,另一个匹配str2,第三个匹配str1〜str2 。 – GCSDC

+0

感谢您的回复。 – Dave123

+0

我确实使用了三个使用|的正则表达式但是当我使用|即使对于无效的字符串,我也总是如此。/^(([0-9A-ZA-Z]){6,40})|((\ d){12})|((([0-9A-ZA-Z]){6,40}) (\ /)((\ d){12}))$ /此问题之前的主要问题是我无法评估字母和数字的组合。 – Dave123

回答

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}允许的符号集:小写字母和数字

0

下面是VB.NET的解决方案。该模式是在3份集于一身:

模式的第一部分,即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 
0

这是我的解决方案:

/^(\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*[a-z])(?=[a-z]*\d)[a-z\d]{2,25}从2至25个字母

\d{1,8}~(?=\d*[a-z])(?=[a-z]*\d)[a-z\d]{2,25}由〜

加入的上述情况测试:https://jsfiddle.net/s2g0b6v9/2/

+0

谢谢大家的好评。我用亚历克斯的答案作为一个很棒的解决方案。 – Dave123

+0

我已经运行亚历克斯的答案,并认为它不适用于案件:大于8的数字数字,数字字母和大于25的数字,只有具有代字号的str1或str2。看到我的链接并替换Alex的答案的变量 –

相关问题