正则表达式提取IP地址:为何Regex 2无法匹配所有样本IP?
为什么Regex2无法匹配样本中的所有IP地址?
咱们先拆解两个正则表达式的核心区别,就能一眼看出问题所在:
关键差异点
- Regex 1 中,每个IP段(比如
123、105这类)后面的匹配规则是(\.|\b):意思是要么是点号.,要么是单词边界\b。 - Regex 2 中,对应的规则是
(\.|$):意思是要么是点号.,要么是字符串结束位置$。
为什么这个差异会导致匹配失败?
要理解这个问题,得先搞懂\b和$的本质区别:
\b是单词边界:只要一边是单词字符(数字、字母、下划线),另一边是非单词字符(比如@、#、!)或者字符串的开头/结尾,这个位置就会被\b匹配到。$是字符串结束标记:只有当IP的最后一个字符正好是整个字符串的最后一个字符时,才会被匹配到。
现在看样本里那些Regex2抓不到的IP场景:
- 被非单词字符包围的IP:比如
@102.021.031.246@@@@@@里的102.021.031.246,它的最后一段246后面跟着的是@(非单词字符)。Regex1的\b能识别246(单词字符)和@(非单词字符)之间的边界,所以可以完整匹配这个IP;但Regex2里没有\b,只有\.或$,这里既不是点号也不是字符串结尾,所以匹配失败。 - 末尾带特殊字符的IP:比如样本最后的
23.124.23.144#,最后一段144后面是#,同样不符合Regex2的\.或$规则,Regex1靠\b能匹配到144和#之间的边界,所以没问题。 - 中间夹在特殊字符中的IP:比如
02.021.031.246@@@@..@里的IP,最后一段后面是@,和第一个情况一样,Regex2无法识别这个位置,自然匹配不到。
总结
Regex1用\b覆盖了IP后面跟着任意非单词字符的场景,而Regex2的$只覆盖IP在字符串绝对末尾的情况。当IP不是字符串最后一个内容,后面还有其他非单词字符时,Regex2就无法完成匹配了。
内容的提问来源于stack exchange,提问作者Madhur
相关产品推荐
相关产品推荐

