正则表达式匹配 MAC 个地址(不同的分隔符、格式等)
Regex match MAC Addresses (different delimiters, formatting, etc.)
我试图找到一个 Python 兼容的 Regex 表达式,最适合匹配 MAC 地址,但排除可能被误认为它们的内容(例如、SSH 密钥)。另外,我想匹配不同的分隔符(例如、-、: 或 .)、不同的格式(例如、*nix、Windows、Cisco)和一个字符串(例如, 无分隔符).
此外,我正在尝试找到可能满足我要求的最短答案(即,正则表达式)。
以下是一些有助于缩小可能性的示例数据:
必须匹配 MAC 地址(即排除额外的特殊字符):
(13:14:5f:cD:42:5f)
#13-14-5f-cD-42-5f
13.14.5f.cD.42.5f/
1314:5fcD:425f#
"1314.5fcD.425f"
1314-5fcD-425f
13145fcD425f
#13145fcD425f:
不得与以下任何一项匹配:
56:32:13:14:5f:cD:42:5f:65
56-32-13-14-5f-cD-42-5f-65
56.32.13.14.5f.cD.42.5f.65
13:14:5f:cD:42:5f:
:13:14:5f:cD:42:5f
111113:14:5f:cD:42:5ffff
ff13:14:5f:cD:42:5f
1314-5fcD.425f
1314-5f.cD:425f
13:14.5f:cD:42-5f
45fcD4
fcD4
13145fcD425f13145fcD425f
aa13145fcD425f13145fcD425fff
这是我最终想到的。我将尝试在下面标题为注释的部分中概述详细信息。我故意留在三个 redundant/unnecessary non-capturing 组,但这有助于为三个路径中的每一个划分代码。
非常感谢您的反馈。谢谢。
\b(?:(?<![-:\.])(?:(?:[0-9A-Fa-f]{2}(?=([-:\.]))(?:[0-9A-Fa-f]{2}){5})|(?:[0-9A-Fa-f]{4}(?=([-:\.]))(?:[0-9A-Fa-f]{4}){2}))(?![-:\.])|(?:[0-9A-Fa-f]{12}))\b
备注:
- 我写的正则表达式 strict-ly 匹配分隔符,这意味着 MAC 地址中的分隔符必须是通过反向引用在整个匹配中相同(例如、hh:hh:hh:hh:hh:hh、NOT hh-hh:hh.hh:hh-hh & NOT hh:hh:hh:hh:hh-hh)
- 分隔符分组在方括号
[]
中,表示里面的任何项目都可以匹配
- 贯穿始终的三个主要分隔符分别是
[-:\.]
dash/hyphen、冒号和 period/dot。
- 我转义了
\.
(点),因为它的含义不明确(例如,.
可以表示 任何字符,这不是我想要的)。
- 我的群组中除了两个都是 non-capturing 群组,因此它们以
(?:
开头并以匹配的 )
. 结尾
|
(管道)代表OR,导致分支
\b
(单词边界)防止在字符串中间找到匹配项(例如,第 7-8、19-20 行)
- 路径:1
(?<![-:\.])
& (?![-:\.])
(负后向和负前向)防止在 SSH 密钥中找到的匹配项(虽然这里可能只需要冒号,但不能说我见过其他两个用于键的分隔符)
- 路径:1.1 *nix/Windows 匹配格式:分隔的十六进制字符对(例如,hh:hh:hh:hh:hh:hh )
[0-9A-Fa-f]{2}
十六进制字符重复两次
(?=([-:\.]))
lookahead & capture (inner parens) the delimiter (capturing group </code>)</li>
<li><code>
匹配存储在捕获组 </code> 中的第一个定界符,<code>(?:[0-9A-Fa-f]{2}){5}
再重复定界符和十六进制对模式五次
- Path:1.2 Cisco 匹配格式:quad hex chars delimited (e.g., hhhh.hhhh.hh嗯)
[0-9A-Fa-f]{4}
十六进制字符重复四次
(?=([-:\.]))
lookahead & capture (inner parens) the delimiter (capturing group </code>)</li>
<li><code>
匹配存储在捕获组 </code> 中的第二个分隔符,<code>(?:[0-9A-Fa-f]{4}){2}
再重复分隔符和四个十六进制字符模式两次
- Path:2字符串匹配格式:所有12个十六进制字符,non-delimited(例如,hhhhhhhhhhhh)
[0-9A-Fa-f]{12}
十六进制字符重复十二次
- 不要求字符串前后没有分隔符,因为 none 在其中使用,并且能够匹配示例第 9 行和第 16 行(但仍遵循单词边界)
为了满足 OP 要求的最短答案,我从上面的答案中删除了 non-capturing 组(即,使它们全部捕获组)和额外的分组为了清楚起见,我得到 140 个字符:
\b((?<![-:\.])([0-9A-Fa-f]{2}(?=([-:\.]))([0-9A-Fa-f]{2}){5}|[0-9A-Fa-f]{4}(?=([-:\.]))([0-9A-Fa-f]{4}){2})(?![-:\.])|[0-9A-Fa-f]{12})\b
这是我用于验证的示例:
56:32:13:14:5f:cD:42:5f:65
(13:14:5f:cD:42:5f)
#13-14-5f-cD-42-5f
56-32-13-14-5f-cD-42-5f-65
13.14.5f.cD.42.5f/
56.32.13.14.5f.cD.42.5f.65
111113:14:5f:cD:42:5ffff
ff13:14:5f:cD:42:5f
1314:5fcD:425f#
1314.5fcD.425f)
1314-5fcD-425f
1314-5fcD.425f
1314-5f.cD:425f
13:14.5f:cD:42-5f
13145fcD425f
#13145fcD425f:
45fcD4
fcD4
13145fcD425f13145fcD425f
aa13145fcD425f13145fcD425fff
我试图找到一个 Python 兼容的 Regex 表达式,最适合匹配 MAC 地址,但排除可能被误认为它们的内容(例如、SSH 密钥)。另外,我想匹配不同的分隔符(例如、-、: 或 .)、不同的格式(例如、*nix、Windows、Cisco)和一个字符串(例如, 无分隔符).
此外,我正在尝试找到可能满足我要求的最短答案(即,正则表达式)。
以下是一些有助于缩小可能性的示例数据:
必须匹配 MAC 地址(即排除额外的特殊字符):
(13:14:5f:cD:42:5f)
#13-14-5f-cD-42-5f
13.14.5f.cD.42.5f/
1314:5fcD:425f#
"1314.5fcD.425f"
1314-5fcD-425f
13145fcD425f
#13145fcD425f:
不得与以下任何一项匹配:
56:32:13:14:5f:cD:42:5f:65
56-32-13-14-5f-cD-42-5f-65
56.32.13.14.5f.cD.42.5f.65
13:14:5f:cD:42:5f:
:13:14:5f:cD:42:5f
111113:14:5f:cD:42:5ffff
ff13:14:5f:cD:42:5f
1314-5fcD.425f
1314-5f.cD:425f
13:14.5f:cD:42-5f
45fcD4
fcD4
13145fcD425f13145fcD425f
aa13145fcD425f13145fcD425fff
这是我最终想到的。我将尝试在下面标题为注释的部分中概述详细信息。我故意留在三个 redundant/unnecessary non-capturing 组,但这有助于为三个路径中的每一个划分代码。
非常感谢您的反馈。谢谢。
\b(?:(?<![-:\.])(?:(?:[0-9A-Fa-f]{2}(?=([-:\.]))(?:[0-9A-Fa-f]{2}){5})|(?:[0-9A-Fa-f]{4}(?=([-:\.]))(?:[0-9A-Fa-f]{4}){2}))(?![-:\.])|(?:[0-9A-Fa-f]{12}))\b
备注:
- 我写的正则表达式 strict-ly 匹配分隔符,这意味着 MAC 地址中的分隔符必须是通过反向引用在整个匹配中相同(例如、hh:hh:hh:hh:hh:hh、NOT hh-hh:hh.hh:hh-hh & NOT hh:hh:hh:hh:hh-hh)
- 分隔符分组在方括号
[]
中,表示里面的任何项目都可以匹配 - 贯穿始终的三个主要分隔符分别是
[-:\.]
dash/hyphen、冒号和 period/dot。 - 我转义了
\.
(点),因为它的含义不明确(例如,.
可以表示 任何字符,这不是我想要的)。 - 我的群组中除了两个都是 non-capturing 群组,因此它们以
(?:
开头并以匹配的)
. 结尾
|
(管道)代表OR,导致分支\b
(单词边界)防止在字符串中间找到匹配项(例如,第 7-8、19-20 行)- 路径:1
(?<![-:\.])
&(?![-:\.])
(负后向和负前向)防止在 SSH 密钥中找到的匹配项(虽然这里可能只需要冒号,但不能说我见过其他两个用于键的分隔符)- 路径:1.1 *nix/Windows 匹配格式:分隔的十六进制字符对(例如,hh:hh:hh:hh:hh:hh )
[0-9A-Fa-f]{2}
十六进制字符重复两次(?=([-:\.]))
lookahead & capture (inner parens) the delimiter (capturing group</code>)</li> <li><code>
匹配存储在捕获组</code> 中的第一个定界符,<code>(?:[0-9A-Fa-f]{2}){5}
再重复定界符和十六进制对模式五次
- Path:1.2 Cisco 匹配格式:quad hex chars delimited (e.g., hhhh.hhhh.hh嗯)
[0-9A-Fa-f]{4}
十六进制字符重复四次(?=([-:\.]))
lookahead & capture (inner parens) the delimiter (capturing group</code>)</li> <li><code>
匹配存储在捕获组</code> 中的第二个分隔符,<code>(?:[0-9A-Fa-f]{4}){2}
再重复分隔符和四个十六进制字符模式两次
- Path:2字符串匹配格式:所有12个十六进制字符,non-delimited(例如,hhhhhhhhhhhh)
[0-9A-Fa-f]{12}
十六进制字符重复十二次- 不要求字符串前后没有分隔符,因为 none 在其中使用,并且能够匹配示例第 9 行和第 16 行(但仍遵循单词边界)
为了满足 OP 要求的最短答案,我从上面的答案中删除了 non-capturing 组(即,使它们全部捕获组)和额外的分组为了清楚起见,我得到 140 个字符:
\b((?<![-:\.])([0-9A-Fa-f]{2}(?=([-:\.]))([0-9A-Fa-f]{2}){5}|[0-9A-Fa-f]{4}(?=([-:\.]))([0-9A-Fa-f]{4}){2})(?![-:\.])|[0-9A-Fa-f]{12})\b
这是我用于验证的示例:
56:32:13:14:5f:cD:42:5f:65
(13:14:5f:cD:42:5f)
#13-14-5f-cD-42-5f
56-32-13-14-5f-cD-42-5f-65
13.14.5f.cD.42.5f/
56.32.13.14.5f.cD.42.5f.65
111113:14:5f:cD:42:5ffff
ff13:14:5f:cD:42:5f
1314:5fcD:425f#
1314.5fcD.425f)
1314-5fcD-425f
1314-5fcD.425f
1314-5f.cD:425f
13:14.5f:cD:42-5f
13145fcD425f
#13145fcD425f:
45fcD4
fcD4
13145fcD425f13145fcD425f
aa13145fcD425f13145fcD425fff