2015-04-28 10 views
0

Добрый вечер Stackoverflow,Scala REGEX ровня MAC адрес

Я застрял в месте, где я не могу получить Scala регулярное выражение соответствует, чтобы играть хорошо, вот мой код

private def handle_read(packet: TFTPReadRequestPacket, tftp_io: TFTP): Unit = { 

    val MAC_REGEX = "([0-9A-F]{2}[:-]){5}([0-9A-F]{2})".r 
    packet.getFilename match { 
     case MAC_REGEX(a) => println(s"Client is coming from $a") 
    } 

} 

Когда регулярное выражение является ([0-9A-F]{2}[:-]) и я прошу для файла 70- это прекрасно и выплевывает, что клиент «приходит от 70», но когда это полное регулярное выражение, и я прошу 70-CD-60-74-24-9C он бросает исключение, как такой

[ERROR] [04/28/2015 21:25:27.818] [polydeploy-baremetal-akka.actor.default-dispatcher-4] [akka://polydeploy-baremetal/user/TFTP_Queue] 70-CD-60-74-24-9C (of class java.lang.String) 
scala.MatchError: 70-CD-60-74-24-9C (of class java.lang.String) 
    at com.polydeploy.baremetal.TFTPQueue$.handle_read(TFTPQueue.scala:40) 
    at com.polydeploy.baremetal.TFTPQueue$.com$polydeploy$baremetal$TFTPQueue$$handle_request(TFTPQueue.scala:33) 
    at com.polydeploy.baremetal.TFTPQueue$$anonfun$receive$1.applyOrElse(TFTPQueue.scala:14) 
    at akka.actor.Actor$class.aroundReceive(Actor.scala:467) 
    at com.polydeploy.baremetal.TFTPQueue$.aroundReceive(TFTPQueue.scala:10) 
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) 
    at akka.actor.ActorCell.invoke(ActorCell.scala:487) 
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:254) 
    at akka.dispatch.Mailbox.run(Mailbox.scala:221) 
    at akka.dispatch.Mailbox.exec(Mailbox.scala:231) 
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

То, что я хочу попробовать и накопить, - это иметь возможность запросить TFTP-запрос для pxelinux.cfg/01-70-CD-60-74-24-9C и вытащить MAC-адрес.

Любая помощь очень ценится!

Спасибо, Лиам.

ответ

1

Когда регулярное выражение ([0-9A-F]{2}[:-]) и я прошу для файла 70- это прекрасно

Это происходит потому, что в этом случае ваше регулярное выражение содержит одну группу.

Это работает для меня:

val MAC_REGEX = "(([0-9A-F]{2}[:-]){5}([0-9A-F]{2}))".r 
"70-CD-60-74-24-9C" match { 
    case MAC_REGEX(a, _*) => println(s"Client is coming from $a") 
} 
// prints "Client is coming from 70-CD-60-74-24-9C" 

Это работает, потому что я обернул все регулярное выражение с группой. a фиксирует эту внешнюю группу и _* представляет собой последовательность игнорируемых совпадений для всех остальных групп. По-видимому, экстрактор Regex возвращает список с элементом для каждой группы захвата.

У меня есть чувство, что есть лучший способ сделать это, хотя ...