2016-07-07 100 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的答案的變量 –

相關問題