2015-05-26 4 views
2

Привета моей регулярного выражения картиныRegex для проверки внутрибрюшинен

^((?:(?:^|\.)(?:\d|[1-9]\d|1\d{2}|2[-4]\d|25[0-5])){4})$ 

это позволит 0.0.0.0, но я не хочу, чтобы 0.0.0.0 пожалуйста кто-нибудь помочь мне

+0

вам нужно разрешить сделать: '' 1.0.0.0', 0.1.0.0', '0.0.1.0',' 0,0 .0.1'? (другими словами, если есть только одно число, не равное нулю, может ли оно быть в любом положении?) –

ответ

2
^(?=.*[1-9])((?:(?:^|\.)(?:\d|[1-9]\d|1\d{2}|2[-4]\d|25[0-5])){4})$ 

Вы можете сделать это через positive lookahead. См демки.

https://regex101.com/r/yW3oJ9/8

+2

Я знаю, что это может быть не так, но это регулярное выражение подвержено катастрофическому обратному отскоку в некоторых очень странных сценариях, подобных этому ] (https://regex101.com/r/yE3oO3/1). Возможно, строка не является пользователем и никогда не произойдет. Тем не менее, мое предложение работает нормально даже в таких случаях. Авинаш также отлично работает. В общем, я бы избегал '. *', Если это не нужно. –

+0

@stribizhev hehehe ......... я подозреваю, что ip-адрес будет возможен в 3050 году, когда население будет миллиардами: P – vks

2

Просто добавьте отрицательное опережения утверждение в начале.

^(?!0+\.0+\.0+\.0+$)((?:(?:^|\.)(?:\d|[1-9]\d|1\d{2}|2[-4]\d|25[0-5])){4})$ 

DEMO

0

Взгляд вперед может использоваться, чтобы установить предел длины. В этом случае это может быть довольно кратким, так как строка должна содержать только цифры и символ ..

Таким образом, я предлагаю использовать (?![0.]+$), как нам нужно только проверить, если у нас нет 0 с и периоды до конца:

^(
(?![0.]+$)     # Here is the look-ahead. 
(?: 
    (?:^|\.) 
    (?: 
     \d|[1-9][0-9]|1\d{2}|2[-4]\d|25[0-5] 
    ) 
){4} 
)$ 

См demo

A one-line JS version:

^((?![0.]+$)(?:(?:^|\.)(?:\d|[1-9][0-9]|1\d{2}|2[-4]\d|25[0-5])){4})$ 
0

Это часть задания?

Если нет, то я не хотел бы использовать регулярное выражение не и предпочитать Строка # сканирование:

ip_subnets = ip.scan(/\d+/).map(&:to_i) # you can use split('.') instead of scan 
ip_subnets.all? { |i| (0..255).include?(i) } && 
    ip_subnets.any? { |i| i != 0 } && 
    ip_subnets.size == 4 
Смежные вопросы