2013-08-21 2 views
0

Я знаю основы Java, но я не слишком опытен с регулярным выражением или шаблонами, поэтому, пожалуйста, извините меня, если я спрашиваю что-то супер простое. Я пишу метод, который определяет IP-адреса и имена хостов. Я использовал regex из этого вопроса here. Проблема я встречая, однако, что предложения без символов учитываются как имена хостовОпределение IP и имени хоста

Heres мой код:

Pattern validHostname = Pattern.compile("^(([a-z]|[a-z][a-z0-9-]*[a-z0-9]).)*([a-z]|[a-z][a-z0-9-]*[a-z0-9])$",Pattern.CASE_INSENSITIVE); 
    Pattern validIpAddress = Pattern.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])([:]\\d\\d*\\d*\\d*\\d*)*$",Pattern.CASE_INSENSITIVE); 
    String msg = c.getMessage(); 
    boolean found=false; 

    //Randomly picks from a list to replace the detected ip/hostname 
    int rand=(int)(Math.random()*whitelisted.size()); 
    String replace=whitelisted.get(rand); 

    Matcher matchIP = validIpAddress.matcher(msg); 
    Matcher matchHost = validHostname.matcher(msg); 

    while(matchIP.find()){ 
     if(adreplace) 
      msg=msg.replace(matchIP.group(),replace); 
     else 
      msg=msg.replace(matchIP.group(),""); 

     found=true; 
     c.setMessage(msg); 
    } 
    while(matchHost.find()){ 
     if(adreplace) 
      msg=msg.replace(matchHost.group(),replace); 
     else 
      msg=msg.replace(matchHost.group(),""); 

     found=true; 
     c.setMessage(msg); 
    } 
    return c; 
+1

Можете привести пример? – prasanth

+1

Можете ли вы привести несколько примеров ввода (некоторые значения для 'msg')? –

+0

Пример сообщения: Привет, зайдите на мой сайт www.google.com. – Zach

ответ

1

Описание

Без образца текста и желаемый результат, я буду стараться изо всех сил ответьте на ваш вопрос.

Я хотел бы переписать вы размещаете выражение имя вроде этого:

A:^(?:[a-z][a-z0-9-]*[a-z0-9](?=\.[a-z]|$)\.?)+$ позволит одиночные имена слов, как abcdefg

B:^(?=(?:.*?\.){2})(?:[a-z][a-z0-9-]*[a-z0-9](?=\.[a-z]|$)\.?)+$ требует строка содержит по крайней мере два периода, как abc.defg.com , Это не позволит периоду появляться в начале или в конце или в последовательных периодах. Число внутри lookahead {2} описывает минимальное количество точек, которые должны отображаться. Вы можете изменить это число по своему усмотрению.

enter image description here

  • ^ матч начало строки якоря
  • (?: начать без захвата группы повышает производительность
  • [a-z][a-z0-9-]*[a-z0-9] текст матча, взятую из исходного выражения
  • (?=\.[a-z]|$) смотреть вперед, чтобы увидеть если следующий символ - точка, за которой следует символ az, или конец строки
  • \.? потребляет одну точку, если она существует
  • ) закрыть группу захвата
  • + требует содержимого группы захвата существовать 1 или несколько раз
  • $ матча конца строки якоря

имена хостов:
A Allows host name without dots
B Requires host name to have a dot

Live Demo with a sentence with no symbols

Я хотел бы также переписать выражение IP

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

Основные различия здесь, что я:

  • удалены множественная \ d * с конца, потому что выражение \d*\d*\d*\d*\d*\d* является эквивалент \d*
  • изменен класс символов [:] к одному символу :
  • Я повернулся захват групп ( ... ) в не-захвате группы (? ... ) который выполняет немного лучше.
+0

Это очень помогает! Единственное, что я могу заметить, это то, что регулярное выражение ловит особые слова ex. «Hello» без каких-либо специальных символов. – Zach

+0

Каковы ваши требования для имени хоста? Должно ли это быть FQDN, которое должно содержать период? –

+0

Имя хоста должно содержать хотя бы «SiteName.com», но такие вещи, как www. Я тоже хотел бы посчитать. И да только периоды. Я не очень беспокоюсь о ipv6 – Zach

Смежные вопросы