2017-08-29 13 views
2

コンマで区切られた1〜31のユニークな(繰り返しではない)リストを検証しようとしています。REGEXのユニークな数字がコンマで区切られました

すなわち

  • 2,4,6,7,1有効な入力です。
  • 2,2,6-が無効
  • 2で無効
  • 1,2,3,4,15,6,7,31が有効
  • 1,2であるが、有効な
  • 2です、 3,4,15,6,7,32が無効
  • 20,15,3

    である私は ^((([0]?[1-9])|([1-2][0-9])|(3[01]))(?!([0]?[1-9])|([1-2][0-9])|(3[01])*,\\1(?!([0]?[1-9])|([1-2][0-9])|(3[01]))を試してみましたが、それは繰り返し番号に

を受け入れています
+2

を確認するために忘れましたか? – ctwheels

+0

あなたのリストは、それ以上の数字を持つことができない固定数の数字を持っていますか?いずれにしても、私はあなたが1つの正規表現でそれをすべて行うのではなく、問題を解決することを提案します:コンマの数字の形式が正しいことを確認する正規表現、カンマで区切って番号がユニークであることをハッシュセット –

+0

これはリストに分割して、そこでアクションを実行すると良いでしょう、本当に正規表現の良い使用ではありません – sniperd

答えて

3

数字の範囲が1桁を超える場合は、キャプチャグループとバックリファレンスの間で、単語境界を
に追加してください。
このは、完全な数字のを単離する。

この特定の一つが麻痺範囲私はこれを行うことができ、パターンを作成している1-31

^          # BOS 
(?!          # Validate no dups 
     .* 
     (          # (1 start) 
      \b 
      (?: [1-9] | [1-2] \d | 3 [0-1])  # number range 1-31 
      \b 
    )          # (1 end) 
     .* 
     \b \1 \b 
) 
(?: [1-9] | [1-2] \d | 3 [0-1])  # Unrolled-loop, match 1 to many numb's 
(?:          # in the number range 1-31 
     , 
     (?: [1-9] | [1-2] \d | 3 [0-1]) 
)* 
$          # EOS 

var data = [ 
 
     '2,4,6,7,1', 
 
     '2,2,6', 
 
     '2,30,16,3', 
 
     '2,', 
 
     '1,2,3,2', 
 
     '1,2,2,3', 
 
     '1,2,3,4,5,6,7,8' 
 
     ]; 
 
     
 
     data.forEach(function(str) { 
 
     document.write(str + ' gives ' + /^(?!.*(\b(?:[1-9]|[1-2]\d|3[0-1])\b).*\b\1\b)(?:[1-9]|[1-2]\d|3[0-1])(?:,(?:[1-9]|[1-2]\d|3[0-1]))*$/.test(str) + '<br/>'); 
 
     });

+0

あなたは天才ですもう一度お返事ありがとうございます。チュートリアルがあれば、それを感謝します –

2

私は完全に正規表現より重複を探すより良い方法があることに同意しますが、正規表現としてこれを行わなければならない場合は、ここで(あなたの正規表現の味に応じて)方法です。

regex101を参照してください(私はこれを複数行にし、テストと読みやすさのために拡張しました)。

^ 
(?!.*\b(\d+)\b.*\b\1\b) 
(0?[1-9]|[12][0-9]|3[01]) 
(,(0?\d|[12][0-9]|3[01]))* 
$ 

説明:更新:

  • (?!.*\b(\d+)\b.*\b\1\b)無し重複
  • (0?[1-9]|[12][0-9]|3[01])一致する最初の数
  • (,(0?\d|[12][0-9]|3[01]))*一致する複数

メモが存在しないことを確認するための負の先読みであります単語境界を使用する - 答えfに基づいてrom @sln

2

です。

パターン:^((?!(\d+),[^\n]*\b\2\b)([1-9]\b|[1-2]\d|3[0-1])(,(?1))?)$

demo

簡単な説明。

  • ^ - マッチがライン
  • (?!(\d+),[^\n]*\b\2\b)の開始 - 次の番号が
    • (\d+)が繰り返されないことを確認するために先に見える - グラブ次の番号
    • ,[^\n]* - しかし、何が続くコンマ改行
    • \b\2\b - 次の番号が再び繰り返される
  • ([1-9]\b|[1-2]\d|3[0-1]) - チェック1-31
    • [1-9]\b間の次数 - 一桁をチェック。境界は、2桁の数字の一致を防ぐために使用されます。
    • [1-2]\d - 10-29
    • 3[0-1]をチェック - 30,31
  • (,(?1))?)をチェックし、次の番号が繰り返されるかどうかを確認するメインパターンに再帰コンマが続く場合。
  • , - チェックの後にacomma
  • (?1) - メインパターンの繰り返し。
  • $ - ラインの終わり

更新:あなたは区切り文字で番号のリストを分割して、反復可能オブジェクト内の重複をチェックしませんなぜ1-31

関連する問題