正则表达式匹配问题:无法捕获第二组IP-名称对
解决正则无法捕获同一行多组IP的问题
你的正则只能匹配name/names行开头后的第一组IP与名称,同一行内的第二组因为没有重复匹配逻辑所以无法捕获。以下是两种可行的解决方法:
方法1:分两次匹配(更易理解)
先匹配name/names开头的整行内容,再在该行内匹配所有IP+名称组:
while( $data =~ /^(?:name|names)\s+(.*)$/mg) { my $line_data = $1; while ($line_data =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\S+)/g) { $LOGGER->debug("IPs : $1 : $2"); } }
方法2:单正则连续捕获
利用\G锚点实现同一行内的连续匹配,无需拆分处理:
while( $data =~ /(?:^(?:name|names)\s+|\G(?!^)\s+)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\S+)/mg) { $LOGGER->debug("IPs : $1 : $2"); }
正则说明:
^(?:name|names)\s+:匹配行开头的name或names及后续空格\G(?!^)\s+:\G表示上一次匹配结束的位置,(?!^)避免匹配行首,确保匹配的是前一组之后的空格- 后续的捕获组负责抓取IP和对应的名称
两种方法都能捕获到所有目标内容:1.1.1.1 testIp1、2.2.2.2 testIp2、192.168.1.1 testIp3,同时排除umesh开头的行。
内容的提问来源于stack exchange,提问作者umesh
相关产品推荐
相关产品推荐

