-1

コンマで区切られた IP のリストを含む文字列を検証するために、有効な .NET Regex を探しています。IP は、単一の IP ( 192.168.12.5 )、マスクされた IP ( 192.168.0.0;255.255.0.0 )、または CIDR 表記 ( 192.168.0.0/16 ) のいずれかです。

ユーザーによる正しい入力例の 1 つとして、次のようなものがあります。

192.168.12.5,192.168.15.7,19​​2.168.0.0;255.255.0.0,192.168.0.0/16

間違った入力の 1 つのサンプル:

192.168.12.5、192.168.15 、* 192.168.0.0 ;255.255.0.0;255.255.0.0 *、192.168.0.0/16

この文字列は空にすることもできます。MVC3 の DataAnnotation 正規表現マッチングを使用して、正規表現を使用してクライアント/サーバー側で入力を検証します。

4

3 に答える 3

3

正確に言うと、各オクテットに 3 桁が含まれていることを単純に検証するだけでは十分ではありません。0 から 255 の間であることを検証する必要があります。これにより、単一の IP アドレスに対する次の式が得られます。

\b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b

マスクを検証するには、式を繰り返す必要があります。CIDR 表記サフィックスを検証するには、0 から 32 までの数値が必要です。

\/(3[0-2]|[012]?\d)

次に、コンマ区切りリストのグループ全体を繰り返す必要があります。わかりやすくするために空白とコメントを追加して、すべてをまとめます。

# Start of line:
^
(
  (
    # An IP address:
    \b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b

    # Optionally followed by either:
    (
      # a CIDR suffix:
      (\/(3[0-2]|[012]?\d))
    |
      # or a subnet mask:
      ;\b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b
    )?
  )

  # Followed by a comma and optional white-space
  ,\s*
)
# Zero or more times:
*

# Followed by:
(
  # An IP address:
  \b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b

  # Optionally followed by either:
  (
    # a CIDR suffix
    (\/(3[0-2]|[012]?\d))
  |
    # or a subnet mask:
    ;\b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b
  )?
)
# Zero or once (to allow empty strings):
?

# End of line
$

もちろん、これは IPv4 アドレスのみをサポートします。

于 2013-02-19T18:33:47.550 に答える
1

この正規表現は、説明した要件に対して検証されます。

([\d]{1,3}.[\d]{1,3}.[\d]{1,3}.[\d]{1,3}[/]*[\d]{0,3}[,;]*)*
于 2013-02-19T18:00:13.143 に答える
0

この正規表現を使用できます

^(?!^;|.*,$)(;?\d{1,3}(\.\d{1,3}){3}(/\d{1,3})?,?)*$
于 2013-02-19T18:07:48.360 に答える