Разделение строки по MAC-адресу с регулярным выражением не работает - PullRequest
0 голосов
/ 06 января 2012

Код:

$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
my ($a, $mac, $b) = 
  split('/([0-9A-F]{2}[:-]){5}([0-9A-F]{2})/', $_);
print $mac;
print "\n";

По какой-то причине $mac всегда пусто, и я не знаю почему.

Ответы [ 5 ]

2 голосов
/ 06 января 2012

Если вы предоставите split со строкой в ​​качестве первого аргумента, она будет разбита на эту строку, как если бы она была регулярным выражением.

split ':', $str;

Это действительно DWIM из:

split /:/, $str;

Итак, ваш код:

split('/([0-9A-F]{2}[:-]){5}([0-9A-F]{2})/', $_);

Действительно означает

split(m[/([0-9A-F]{2}[:-]){5}([0-9A-F]{2})/], $_);
# or
split(/\/([0-9A-F]{2}[:-]){5}([0-9A-F]{2})\//, $_);

Также вы хотите, чтобы split сохранил значение, которому он соответствует, поэтому вы хотите, чтобы все совпадение было в ().

$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
my ($a, $mac, $b) = split(/((?:[0-9A-F]{2}[:-]){5}[0-9A-F]{2})/, $_);
print $mac, "\n";

Поскольку вы, похоже, используете только $mac, вам не нужно использовать split.

my ($mac) = /((?:[0-9A-F]{2}[:-]){5}[0-9A-F]{2})/;
# or
my @macs = /((?:[0-9A-F]{2}[:-]){5}[0-9A-F]{2})/g;
1 голос
/ 06 января 2012

Если вам нужен только MAC-адрес, тогда

$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
/((:?[a-fA-F0-9]{2}[:-]){5}[a-fA-F0-9]{2})/;
print "$1\n";
1 голос
/ 06 января 2012

Это проще, чем split.Вы можете просто соответствовать:

$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
$_ =~ /(([0-9A-F]{2}[:-]){5}([0-9A-F]{2}))/;
print $1;
1 голос
/ 06 января 2012

Сначала вам нужно удалить "'" вокруг регулярного выражения, его там быть не должно. Затем вам нужно заключить все выражение разбиения в круглые скобки, если вы хотите получить всю строку разбиения в результате.

$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
my ($a, $mac, $b) =
split(/(([0-9A-F]{2}[:-]){5}([0-9A-F]{2}))/, $_);
print $mac;
print "\n";
0 голосов
/ 07 января 2012

split ожидает шаблон, который соответствует тому, что разделяет MAC-адреса, которые вы хотите извлечь. У вас нет MAC-адресов, разделенных другими вещами, поэтому split не подходит для использования здесь. Вы хотите оператор матча.

my ($mac) = /((?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})/;

Или, если вы хотите извлечь несколько адресов из одной строки:

my @macs = /(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}/g;

Примером split будет:

my @bytes = split /[:-]/, $mac;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...