Я использую IPAddress.TryParse () для анализа IP-адресов. Однако это слишком мягко (синтаксический анализ "1" возвращает 0.0.0.1). Я хотел бы ограничить ввод октетной нотацией с точками. Как лучше всего это сделать?
(Примечание: я использую .NET 2.0)
Редактировать
Позвольте мне уточнить:
Я пишу приложение, которое будет сканировать диапазон IP-адресов в поисках определенных устройств (в основном сканер портов). Когда пользователь вводит «192.168.0.1» в качестве начального адреса, я хочу автоматически указать «192.168.0.255» в качестве конечного адреса. Проблема в том, что когда они набирают «1», он анализирует как «0.0.0.1», а конечный адрес заполняется как «0.0.0.255», что выглядит глупо.
Оба, правда. Мне нужно проверить, что пользователь ввел октет с точками, и преобразовать ввод в System.Net.IPAddress.





IP-адрес на самом деле является 32-битным числом - это не xxx.xxx.xxx.xxx - это просто читаемый человеком формат для того же самого. Таким образом, IP-адрес 1 на самом деле равен 0.0.0.1.
Обновлено: Учитывая разъяснения, вы можете либо использовать регулярное выражение, как было предложено, либо отформатировать короткие сокращения по своему вкусу, поэтому, если вы хотите, чтобы «1» отображалось как «1.0.0.0». вы можете добавить это и по-прежнему использовать метод синтаксического анализа.
Верно, но когда пользователь набрал «1», он, скорее всего, не имел в виду «0.0.0.1».
Если вас интересует разбор формата, я бы использовал регулярное выражение. Вот хороший (источник):
bool IsDottedDecimalIP(string possibleIP)
{
Regex R = New Regex(@"\b(?:\d{1,3}\.){3}\d{1,3}\b");
return R.IsMatch(possibleIP) && Net.IPAddress.TryParse(possibleIP, null);
}
Это регулярное выражение не обнаруживает недопустимые IP-адреса, но обеспечивает соблюдение вашего шаблона. TryParse проверяет их действительность.
Не компилируется для меня ... недопустимые escape-символы. Я слишком много занимаюсь регулярным выражением n00b, чтобы отлаживать :(
Regex.IsMatch (SubjectString, "\\ b (?: [0-9] {1,3} \\.) {3} [0-9] {1,3} \\ b")
или @ "\ b (?: \ d {1,3} \.) {3} \ d {1,3} \ b" или "\\ b (?: \\ d {1,3} \\. ) {3} \\ d {1,3} \\ b "
@Diadistis - Я пробовал это, и это не сработало, но оказалось, что я также передавал неправильную строку. Думаю, нужно одновременно все делать правильно :)
Спасибо, Джон - я всегда забываю "@" на этом сайте.
вы пытаетесь разобрать или проверить? синтаксический анализ «1» должен вернуть вам 0.0.0.1 - я не понимаю, что вы имеете в виду под «разрешающим», если только вы не пытаетесь проверить, что входные данные являются IP-адресом.