我遇到了正则表达式匹配的挑战,对于你们中的一个人来说可能太容易了。我希望你能帮我解决这个问题。 我需要使用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,但是没有产生正确的结果。
请问好吗?
提前谢谢
答案 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})$/
通过〜