2016-02-29 19 views
8

私はドッカープロジェクトを開発しています。リポジトリ名を確認する正規表現を書く必要があります。次のように 要件:regex {m、n}と(正規表現){m、n}の違いは何ですか?

  1. だけUPCASEを除外し、ASCIIのキャラが含まれます。
  2. 特殊文字は、ドット(。)、ハイフン( - )、下線(_)以外は除きます。
  3. はアルファベットと数字で始まり、それで終わります。
  4. 特殊文字を連続して表示することはできません。
  5. 長さの制限(分:2、最大:255):

    ([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255} 
    

    しかし、リポジトリ名がe-e_1.1

    あるときには、[OK]をすることはできません

はその後、私の正規表現は、

変更すると:

[a-z0-9]+(?:[._-][a-z0-9]+)*{2,255} 

これで問題ありません。

誰かが説明できますか?前もって感謝します。

+0

'regex {m、n}'に続いて 'm'を' n'回続けて 'x '文字を入力すると、(regex){m、n}'は "regexregexregex..regex"( 'm、 '〜' n'回) – Maroun

+0

@MarounMaroun regex正規表現を指定し、 "正規表現"の文字列を指定しない – xautjzd

答えて

8

正規表現では、限定数量{2,255}がグループ1([a-z0-9]+(?:[._-][a-z0-9]+)*)内のパターン全体に適用されます。 2〜255回繰り返すことができます。文字列全体の長さが2〜255文字に制限されているわけではありません。 [a-z0-9]+にマッチした文字列は、1つのまたは以上文字を持つことができるので、

今、あなたの[a-z0-9]+(?:[._-][a-z0-9]+)*{2,255}正規表現は、あまりにも、無制限の文字を一致させることができます。 (?:[._-][a-z0-9]+)*は、0個以上の文字と一致することができます。ここでは限定数量限定器{2,255}は必要なときには機能しません。

^(?=.{2,255}$)[a-z0-9]+(?:[._-][a-z0-9]+)*$ 
^^^^^^^^^^^^^ 

(?=.{2,255}$)先読みはの最初に一度だけ実行されます。

は2〜255文字まで入力文字列の長さを制限するには、開始時に固定された先読みを使用する必要があります文字列と一致するのは、先読みの条件が満たされている場合のみです:2〜255文字でなければなりません( .は改行以外の任意の文字と一致しますが、後で一致するパターンの特定の文字のみを許可するので重要ではありません文字列の最後まで)。

+0

ありがとう、私は多くを学んだ。私は正規表現について行く長い道のりがあると思う、あなたの答えをありがとう! – xautjzd

+0

道は長い必要はありません。 [*先読みの例:単純なパスワードの検証*](http://www.rexegg.com/regex-lookarounds.html#password)ショートカットの記事を読んでください:) –

関連する問題