4

次のルールを満たすすべての文字列に一致させたい-

  • 小文字と数字とダッシュで構成する必要があります
  • 文字または数字で始まる必要があります
  • 文字または数字で終わる必要があります
  • 文字列の合計の長さは 3 文字以上 20 文字以下にする必要があります
  • ドット.はオプションです。2 つ以上の連続したドットがあってはなりません.
  • ダッシュ-はオプションです。連続する 2 つ以上のダッシュがあってはなりません-
  • ドット.とダッシュ-を連続させてはなりません // 文字列aaa.-aaabbbが無効です
  • アンダースコアは許可されていません

私はこの正規表現を思いつきました:

^[a-z0-9]([a-z0-9]+\.?\-?[a-z0-9]+){1,18}[a-z0-9]$

[a-z0-9] //should start/end with a letter or a number
([a-z0-9]+\.?\-?[a-z0-9]+){1,18}  //other rules

ただし、次のようないくつかのシナリオでは失敗しています-

abcdefghijklmnopqrstuvwxyz //should fail total number of chars greater than 20  
aaa.-aaabbb //should fail as dot '.' and dash '-' are consecutive

誰でもこの正規表現を修正するのを手伝ってもらえますか?

4

2 に答える 2

3

これは、先読みアサーションで実現できます。

^(?!.*[.-]{2})[a-z0-9][a-z0-9.-]{1,18}[a-z0-9]$

説明:

^                # Start of string
(?!              # Assert that the following can't be matched:
 .*              #  Any number of characters
 [.-]{2}         #  followed by .. or -- or .- or -.
)                # End of lookahead
[a-z0-9]         # Match lowercase letter/digit
[a-z0-9.-]{1,18} # Match 1-18 of the allowed characters
[a-z0-9]         # Match lowercase letter/digit
$                # End of string
于 2012-08-02T12:03:51.240 に答える
1

私はこれを思いつきました。これは、ティムのソリューションに似た否定的な先読みを使用しますが、それを適用する方法が異なります。ドットまたはダッシュを検出した場合にのみルック アヘッドを実行するため、バック トラッキングをあまり実行する必要がないため、パフォーマンスがわずかに向上する可能性があります。

^[a-z0-9]([a-z0-9]|([-.](?![.-]))){1,18}[a-z0-9]$

説明:

^                  # Start of string
[a-z0-9]           # Must start with a letter or number
(                  # Begin Group
   [a-z0-9]        # Match a letter or number
   |               # OR
   ([-.](?![.-]))  # Match a dot or dash that is not followed by a dot or dash
){1,18}            # Match group 1 to 18 times
[a-z0-9]           # Must end with a letter or number
$                  # End of string
于 2012-08-02T12:17:37.527 に答える