2016-03-02 2 views
0

Я делаю функцию, которая принимает пример и IP-адрес. Напр.Сравнение массива?

compare('192.168.*','192.168.0.42'); 

Астерикс указывает, что следующие части ip могут быть любыми. Функция возвращает true или false на основании того, является ли пример и ip совпадением. Я попробовал такое решение.

var compare = function(example, ip){ 
    var ex = example.split("."); 
    var ip = ip.split("."); 
    var t = 0; 
    for(var i=0; i<4; i++){ 
    if(ex[i] == ip[i] || ex[i] == "*" || typeof ex[i] === 'undefined' && ex[i-1] == "*"){ 
      t++ 
      if(t==4){ 
      return true 
      } 
     }else{ 
     return false; 
     } 
    } 
} 

Каковы основные преимущества использования регулярного выражения над этим решением? Что было бы лучшим регулярным выражением для этого?

+0

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

+0

Вы задаете вопрос для JavaScript или для Java тоже? –

ответ

1

Как насчет проверки, если они не равны, а затем просто вернуть false?

var compare = function(example, ip){ 
 

 
    // You should have some basic IP validations here for both example and ip. 
 
    
 
    var ex = example.split("."); 
 
    var ip = ip.split("."); 
 
    for(var i=0; i<ex.length; i++){ 
 
    
 
     if(ex[i]=='*') 
 
     break; 
 
    
 
     if(ex[i]!=ip[i]) 
 
     return false; 
 
    
 
    } 
 
    
 
    return true; 
 
} 
 

 
alert(compare('333.321.*','333.321.345.765')); 
 
alert(compare('333.322.*','333.321.345.765')); 
 
alert(compare('333.321.345.*','333.321.345.765'));

+0

работает, пока вы не захотите что-то вроде '' 333.444. *. 555''. – zzzzBov

0

Это идет намного лучше с регулярными выражениями. Попробуйте следующее:

function compare(example, ip) { 
    var regexp = new RegExp('^' + example.replace(/\./g, '\\.').replace(/\*/g, '.*')); 
    return regexp.test(ip); 
} 

compare('192.168.*', '192.168.0.42'); // => true 
compare('192.167.*', '192.168.0.42'); // => false 

Что это такое, он преобразует ваш шаблон в регулярное выражение. Регулярные выражения чрезвычайно эффективны в сопоставлении строки. Он также охватывает такие случаи:

compare('192.168.*.42', '192.168.1.42'); // => true 
compare('192.167.*.42', '192.168.1.43'); // => false 
Смежные вопросы