正確に言うと、各オクテットに 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 アドレスのみをサポートします。