2010-09-17 2 views
1

Мне нужно найти внутренние IP-адреса с помощью регулярного выражения, мне это удалось, но в следующих случаях все 4 соответствуют. Мне нужно регулярное выражение, которое не соответствует первому, но соответствует следующему 3. Каждая строка представляет собой другой вход.Точное распознавание IP-адресов regex help

! "version 10.2.0.4.0 detected" 
+ "version 10.2.0.42 detected" 
+ "version 10.2.0.4 detected" 
+ "version 10.2.0.4" 

редактировать: мой текущий регулярное выражение

(?-i)\b10\.2.(?:[0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b 

Любые идеи?

ответ

1

Я думаю, @ ответ wrikken был правильным, но это было в комментариях одного из удаленных сообщений:

Здесь:

(?<![0-9]\.)((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?!\.[0-9]) 
+0

Важным моментом является (?! \. [0-9]) в конце. – dereli

0

Используйте любой регулярное выражение, которое вы хотите, чтобы соответствовать IP (либо из указанных выше двух работ для ваших сценариев), а также использовать (?:^|\s+) в начале и (?:\s+|$) в конце, чтобы убедиться, что есть пробелы или ничего вокруг значения.

  • (?:) определяет группу, которая не отражает его содержание
  • ^ является начало строки/строки и $ это конец строки \ строки
  • \s+ это один или несколько пробельных символов
  • | является оператором чередовании, то есть один или другой вариант по обе стороны от |

Использование выражения в качестве отправной точки, вы в конечном итоге с

(?-i)(?:^|\s+)10\.2.(?:[0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\s+|$) 
+0

Не забудьте котировку для последнего. –

+0

Я предполагал, что это означало конец строки, а не буквальную цитату ... – bdukes

+0

спасибо, но мне нужно было «(?! \. [0-9])» в конце перед «\ b», – dereli

2

В PCRE:

/\b((1?[1-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))(\.((1?[1-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))){3}\b/ 

Это довольно строгий матч, не допуская несколько нулей, так 00.00.00.00 является недействительным (0.0.0.0 есть).

+0

+1 для более полного ответа - он должен работать в .net (как требуется по вопросу), если вы удалите ведущую и конечную косые черты. –

+0

Ну, косые черты - часть PCRE, я всегда использую PCRE, когда показываю Regex. – polemon

+1

@polemon: Да, но вопрос явно указывает, что .NET - это движок, который он использует. –