验证用户输入的MAC地址的最佳方法是什么?
格式为HH:HH:HH:HH:HH:HH
,其中每个H
都是十六进制字符。
例如,00:29:15:80:4E:4A
有效,而00:29:804E4A
无效。
答案 0 :(得分:46)
如果你只是语法,那么这个正则表达式应该适合你
import re
...
if re.match("[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", x.lower()):
...
它接受带有:
或-
的12个十六进制数字,或者不作为对之间的分隔符(但分隔符必须是统一的...要么所有分隔符都是:
,要么全部为{ {1}}或没有分隔符。)
这是解释:
-
表示十六进制数字[0-9a-f]
表示我们想要其中两个{2}
表示短划线或冒号,但可选。请注意,短划线第一个字符不表示范围,而只表示自身。此子表达式括在括号中,以便以后可以重用作后向引用。[-:]?
是另一对十六进制数字[0-9a-f]{2}
这意味着我们希望将之前匹配的相同表达式匹配为分隔符。这就是保证一致性的原因。请注意,regexp语法是\\1
,但我使用的是常规字符串,因此反斜杠必须通过加倍来转义。\1
另一对十六进制数字[0-9a-f]{2}
上一个带括号的块必须重复4次,总共有6对数字:{4}
<pair> [<sep>] <pair> ( <same-sep> <pair> ) * 4
字符串必须在它们之后结束请注意,在Python $
中,只检查从字符串的开头开始,因此不需要在开头re.match
。
答案 1 :(得分:3)
我讨厌强迫用户思考计算机的程序。
通过接受任何有效格式使其更友好。
剥离分隔符,无论它是什么,然后获取剩下的十六进制值。这样,如果用户输入破折号或空格,它也可以。
import string
allchars = "".join(chr(a) for a in range(256))
delchars = set(allchars) - set(string.hexdigits)
def checkMAC(s):
mac = s.translate("".join(allchars),"".join(delchars))
if len(mac) != 12:
raise ValueError, "Ethernet MACs are always 12 hex characters, you entered %s" % mac
return mac.upper()
checkMAC("AA:BB:CC:DD:EE:FF")
checkMAC("00-11-22-33-44-66")
checkMAC("1 2 3 4 5 6 7 8 9 a b c")
checkMAC("This is not a mac")
答案 2 :(得分:1)
如果你想确保整个但不是两者都有' - '或':',你可以在Python中使用以下内容:
import re
def is_valid_macaddr802(value):
allowed = re.compile(r"""
(
^([0-9A-F]{2}[-]){5}([0-9A-F]{2})$
|^([0-9A-F]{2}[:]){5}([0-9A-F]{2})$
)
""",
re.VERBOSE|re.IGNORECASE)
if allowed.match(value) is None:
return False
else:
return True
答案 3 :(得分:1)
这就像一个魅力。
def isMAC48Address(inputString):
if inputString.count(":")!=5:
return False
for i in inputString.split(":"):
for j in i:
if j>"F" or (j<"A" and not j.isdigit()) or len(i)!=2:
return False
return True
答案 4 :(得分:0)
private static final String MAC_PATTERN = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$";
private boolean validateMAC(final String mac){
Pattern pattern = Pattern.compile(MAC_PATTERN);
Matcher matcher = pattern.matcher(mac);
return matcher.matches();
}
答案 5 :(得分:0)
短划分的MAC地址还可以包含&#39; 01 - &#39; prefix,指定它是以太网MAC地址(不是令牌环,例如......谁使用令牌环?)。
这里的内容有些完整且易于以合乎逻辑的步进方式阅读:
def IsMac(S):
digits = S.split(':')
if len(digits) == 1:
digits = S.split('-')
if len(digits) == 7:
if digits[0] != '01':
return False
digits.pop(0)
if len(digits) != 6:
return False
for digit in digits:
if len(digit) != 2:
return False
try:
int(digit, 16)
except ValueError:
return False
return True
for test in ('01-07-09-07-b4-ff-a7', # True
'07:09:07:b4:ff:a7', # True
'07-09-07-b4-GG-a7', # False
'7-9-7-b4-F-a7', # False
'7-9-7-b4-0xF-a7'): # False
print test, IsMac(test)
答案 6 :(得分:0)
import re
def MacValidator(inputMacList):
def MacParser(mac):
octets = re.split('[\:\-]', mac)
if len(octets) != 6:
return False
for i in octets:
try:
if int(i, 16) > 255:
return False
except:
return False
return mac
return [i.upper() for i in inputMacList if MacParser(i) != False]
macList = ["00-15-F2-20-4D-6B", "Kozel", "00:13:aa:00:00:01",
"00:13:AA:00:tr:01", "00-01-01-20-55-55", "00-01-01-20abc-55"]
validMacList = MacValidator(macList)
答案 7 :(得分:0)
我作弊并使用了其他人提交的多个答案的组合。我认为这是非常明确和直接的一个班轮。 mac_validation
应该返回True
或False
。
import re
mac_validation = bool(re.match('^' + '[\:\-]'.join(['([0-9a-f]{2})']*6) + '$', mac_input.lower()))
答案 8 :(得分:0)
此正则表达式验证以下MAC格式
"Ae:Bd:00:00:00:00"
"00-00-00-00-00-00"
"aaaa.bbbb.cccc"
private static final String MAC_PATTERN = "(([0-9A-Fa-f]{2}[-:.]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\\.){2}[0-9A-Fa-f]{4})";
public class MacRegExp {
private static final String MAC_PATTERN = "(([0-9A-Fa-f]{2}[-:.]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\\.){2}[0-9A-Fa-f]{4})";
static boolean validateMAC(final String mac){
Pattern pattern = Pattern.compile(MAC_PATTERN);
Matcher matcher = pattern.matcher(mac);
return matcher.matches();
}
}
希望这有帮助
答案 9 :(得分:0)
#Just works Perfect
#validate the MAC addr
#!/usr/bin/python
import re
mac = "01-3e-4f-ee-23-af"
result = re.match(r"([0-9a-fA-F]{2}[-:]){5}[0-9a-fA-F]{2}$",mac)
if result:
print ("Correct MAC")
else:
print ("Incorrect MAC")
答案 10 :(得分:0)
let globalReaction;
// DOMSubtreeModified fired, globalReaction is set
let spam;
spam = setInterval(() => {
if (globalReaction) {
globalReaction.click();
}
}, 50);