我有一个正则表达式可以正确匹配我正在处理的数据子集。当我针对完整的数据集运行它时,它开始失败。我注意到一些价值 取决于列,“ NA”与MAC地址还是AP名称。
样本数据:
00:0b:85:57:bc:c0 00:0b:85:57:bc:c1 AP1130 10.10.163.217 Joined
00:1c:0f:81:db:80 00:1c:63:23:ac:a0 AP1140 10.10.163.216 Joined
00:1c:0f:81:fc:20 00:1b:d5:9f:7d:b2 AP1 10.10.163.215 Joined
00:1c:0f:81:fc:20 N A N A 10.10.163.215 Not joined
00:21:1b:ea:36:60 00:0c:d4:8a:6b:c1 AP2 10.10.163.214 Joined
正则表达式:
((?:(?:[0-9a-f]{2}[:-]){5})(?:[0-9a-f]{2}))(?:\s+?)(((?:(?:[0-9a-f]{2}[:-]){5})(?:[0-9a-f]{2}))|(N A))(?:\s+)((AP.+?)|(N A))(?:\s)
我修改了我的正则表达式,但是它仍然与MAC地址或“ NA”不匹配。 名称字段相同:匹配AP名称或“ NA”
我的现状:https://regex101.com/r/sgGEzh/1
我认为方括号不正确,但是看不到我的(|)OR运算符出现故障的地方。我现在正在复制某些组。
我应该匹配第一个MAC地址,第二个MAC地址或字符串'NA',最后一个AP名称或字符串'NA'。
我应该每行总是得到三个匹配的组。
直到我尝试处理'NA'字符串之前。
答案 0 :(得分:1)
这是我对您的输入数据和要求的看法:
([a-f0-9]{2}(?::[a-f0-9]{2}){5})\s+((?:[a-f0-9]{2}(?::[a-f0-9]{2}){5})|N A)\s+(N A|\S+)
答案 1 :(得分:1)
您要匹配正确的东西,只需要摆脱N A
和AP.+?
周围不需要的捕获组即可。这些导致这些字符串最终以不同的组形式出现在结果中。您只需要3个捕获组。
您还有许多其他确实不需要的组,例如\s+?
周围的非捕获组。如果每个|
替代项已经在组中,则不需要它们。您唯一需要的非捕获组就是量化后的[0-9a-f]{2}[:-]
周围的那个组。
以下内容可以工作并删除所有冗余组:
((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2})\s+?((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}|N A)\s+(AP.+?|N A)\s