2013-05-08 2 views
3

Я пытаюсь проверить адреса mac. В этом случае нет - или :, например, действительный макинтош будет либо:C# Regex Validating Mac Address

0000000000 
00-00-00-00-00-00 
00:00:00:00:00:00 

Однако я получаю ложные когда набегать код ниже:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Text.RegularExpressions; 

namespace parsingxml 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Write("Give me a mac address: "); 

      string input = Console.ReadLine(); 
      input = input.Replace(" ", "").Replace(":","").Replace("-",""); 

      Regex r = new Regex("^([:xdigit:]){12}$"); 


      if (r.IsMatch(input)) 
      { 
       Console.Write("Valid Mac"); 
      } 
      else 
      { 
       Console.Write("Invalid Mac"); 
      } 
      Console.Read(); 
     } 
    } 
} 

ВЫВОД: Invalid Mac

+2

Uh what is '[: xdigit:]'? – TGlatzer

+1

Не в .NET это не так. – qJake

+0

См. Мои изменения ниже. Ваш код работает для меня, если я вложу строку Regex. – qJake

ответ

7

.NET regexне имеет поддержки для символов класса POSIX. И даже если это не поддерживает, необходимо заключить его в [], чтобы сделать его эффективным, т.е. [[:xdigit:]], в противном случае, он будет рассматриваться как класс символов с символами :, x, d, i, g, t.

Вы, вероятно, хотите это регулярное выражение вместо (для МАС-адреса после того как вы очистили ненужные символы):

^[a-fA-F0-9]{12}$ 

Обратите внимание, что при очистке строки пространства, - и :, вы позволите входы как показано ниже, чтобы передать:

34: 3-342-9fbc: 6:7 

DEMO

+0

Не будет соответствовать «12-23-34-45-56-67' или« 12: 23: 34: 45: 56: 67 », которые действительны в соответствии с запросом. – qJake

+1

@SpikeX: ** Прочитайте код ** - OP очистил символы ':' и '-'. Поэтому они будут соответствовать. – nhahtdh

+0

Возможно, OP только очистил персонажей, потому что он думал, что это единственный способ проверить его. @ZacBorders Если ваш ввод действительно содержит только буквы и цифры (нет ':' или '-'), то это определенно должно работать для вас:'^[a-fA-F0-9] {12} $ '. Если это не так, вы делаете что-то еще не так, и вы должны отлаживать свою программу, чтобы узнать, что это такое. – qJake

1

Похоже, вы можете просто сделать следующее:

Regex r = new Regex("^([0-9a-fA-F]{2}(?:(?:-[0-9a-fA-F]{2}){5}|(?::[0-9a-fA-F]{2}){5}|[0-9a-fA-F]{10}))$"); 

Или это, что намного проще и будет более снисходителен:

Regex r = new Regex("^([0-9a-fA-F]{2}(?:[:-]?[0-9a-fA-F]{2}){5})$"); 
+0

Это не соответствует ни одному из '122334455667',' 12-23-34-45-56-67', или '12: 23: 34: 45: 56: 67'. http://gskinner.com/RegExr/ – qJake

+0

И теперь ваше регулярное выражение недействительно, у вас есть несогласованная скобка. – qJake

+1

@SpikeX Мне потребовалось немного времени, чтобы проверить его. Он должен быть исправлен. –

5

Попробуйте это регулярное выражение вместо:

^(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}|(?:[0-9a-fA-F]{2}-){5}[0-9a-fA-F]{2}|(?:[0-9a-fA-F]{2}){5}[0-9a-fA-F]{2}$

Матчи:

  • 12-23-34- 45-56-67
  • 12: 23: 34: 45: 56: 67

Но нет:

  • 12: 34-4556-67

Редактировать: Ваш код работает для меня.

enter image description here

+2

Я не сомневаюсь, что работает, но мне более любопытно, почему моя реализация терпит неудачу, поскольку теоретически она будет соответствовать даже 12: 34-4556-67, и я не хочу, чтобы меня зависали от навыков плохого набора текста пользователь дает мне mac. –

+0

Вы должны принимать только действительные MAC-адреса в формате, определенном стандартом IEEE MAC-48: http://en.wikipedia.org/wiki/MAC_Address Таким образом, '12: 23-3445-56: 67' является ** недействительно. – qJake

+0

@ZacBorders: проблема в том, что созданное вами регулярное выражение не поддерживается .NET regex. Однако идея правильная. – nhahtdh

0

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

Regex rxMacAddress = new Regex(@"^[0-9a-fA-F]{2}(((:[0-9a-fA-F]{2}){5})|((:[0-9a-fA-F]{2}){5}))$") ; 

6 пар шестнадцатеричных цифр, либо сепаратор двоеточием или дефисом, но не смесь.

+0

Спасибо за обмен. Есть небольшая ошибка, хотя я верю: вторая: должна быть a - – ocroquette

0

Ваше регулярное выражение не очень хорошо. Здесь у вас есть хороший:

public const string ValidatorInvalidMacAddress = "^([0-9A-Fa-f]{2}[:-]?){5}([0-9A-Fa-f]{2})$"; 
+0

Просто публиковать регулярное выражение не поможет Zac узнать, почему его регулярное выражение нуждается в работе. Ответ должен быть улучшен, чтобы объяснить, почему его регулярное выражение нуждается в улучшении и дает читателям понимание того, что делает предлагаемое регулярное выражение. –

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