使用正则表达式按MAC地址拆分字符串不起作用

时间:2012-01-06 16:08:36

标签: regex perl

代码:

$_ = "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 个答案:

答案 0 :(得分:2)

如果你提供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 :(得分:1)

首先你需要删除正则表达式周围的“'”,它不应该在那里。 然后,如果您希望将整个拆分字符串作为结果,则需要将整个拆分表达式括在括号内。

$_ = "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";

答案 2 :(得分:1)

这比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;

答案 3 :(得分:1)

如果您只需要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";

答案 4 :(得分:0)

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;