2016-07-07 6 views
0

正規表現の一致が難しい場合があります。この問題で私を助けてくれることを願っています。 javascriptまたはVB.netを使用して文字列形式をワンショットでテストする必要があります。文字と数字の組み合わせが一致正規表現

文字列は、str1〜str2のように1つのチルダ文字で区切られた部分か、またはstr1またはstr2のようなチルダ文字のない部分だけで区切られています。

Str1は0〜8桁のシーケンスです。 str1の長さがゼロの場合、チルダ文字も存在しません。

Str2の長さは0〜25文字で、フォーマットは文字と数字の組み合わせでなければなりません。文字や数字だけが良いものではなく、両方の組み合わせであることに注意してください。 str2の長さがゼロの場合、チルダ文字は存在しません。

str1〜str2の組み合わせはオプションフィールドなので、str1〜str2の長さはゼロであり、str1〜str2の値は空になります。

たとえば、12345678〜ab2345cdef、12345およびab2345はすべて正しい形式ですが、12345678〜abcdefghおよび12345678〜70934527654は、2番目の部分が文字と数字の組み合わせではないため、正しい形式ではありません。

私は/^([¥d]{4,8})(~)([az\d]{0,25})$/.test('12345678~ab2345cdef ')のようなパターンで解決しようとしましたが、私は123456やab1234のような例で正しい結果を得ても正しい結果を生み出すことはできません。

どうぞよろしくお願いします。

Mastering Lookahead and Lookbehind上の例 Regular Expressionsとチュートリアルのために、公式文書があり

+0

期待された結果が得られないテスト文字列はどれですか?あなたはどんなエラーを出していますか? あなたのシナリオを見ると、str1だけにマッチするもの、str2にマッチするもの、str1〜str2にマッチするものの3つの正規表現を同じもの(|を使って)で組み合わせる必要があります。 。 – GCSDC

+0

ありがとうございます。 – Dave123

+0

私は3つの正規表現を|しかし、私が|無効な文字列であっても常に私は真実になります。 (([0-9a-zA-Z]){(6,40})|((d){12} (\ /)((\ d){12}))$ /この問題の前の主な問題は、私がアルファベットと数字の組み合わせを評価することができないということです。 – Dave123

答えて

1

事前にありがとうございます。

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)非キャプチャ先読みパターン
\d{4,8}をキャプチャする文字列
(something)の文字列
$最後の
^スタートあなたの例には、以下試してくださいとして
4〜8桁
(?=\d*[a-z])ゼロ以上先に先に数字手紙
(?=[a-z]*\d)ゼロ以上の文字
[a-z\d]{0,25}許さシンボルセット:小文字と数字

0

ここVB.NETでのソリューションです。パターンは、3つの部分が一つに巻かれている:最初の部分のための

パターンすなわち1-8桁

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

第二の部分のパターン、すなわちチルダを有する2つの

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{1,25}$ 

組み合わせ、:少なくとも1つの文字または数字を有する1-25英数字

^[0-9]{1,8}~(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{1,25}$ 

は、3つのパターンは、1つの正規表現を形成する|と接合されています。

私はコードにいくつかのテストケースを含めました。

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

これは私のソリューションです:2〜25文字

\d{1,8}~(?=\d*[a-z])(?=[a-z]*\d)[a-z\d]{2,25} 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}~(?=\d*[a-z])(?=[a-z]*\d)[a-z\d]{2,25})$/ 

\d{1,8}は〜

することにより、上記例の参加しますテスト:https://jsfiddle.net/s2g0b6v9/2/

+0

あなたの素晴らしい答えに感謝します。私は素晴らしい解決策としてアレックスの答えを使用しました。 – Dave123

+0

私はすでにアレックスの答えを実行し、ケースで真ではないことを確認してください:数字桁が8より大きく、数値文字と数字が25より大きく、チルダ付きのstr1またはstr2しかありません。私のリンクを見て、アレックスの答えの変数を取り替えてください –

関連する問題