【问题标题】:Need help in creating regex, not able to get second group of match pattern在创建正则表达式时需要帮助,无法获得第二组匹配模式
【发布时间】:2023-02-03 20:41:22
【问题描述】:

我正在尝试为以下数据创建正则表达式以进行解析,但无法获得第二个匹配模式2.2.2.2 testIp2。由于对正则表达式的了解不多,因此苦苦挣扎了将近 12 个小时。

要解析的数据:

show names
names 1.1.1.1 testIp1 2.2.2.2 testIp2
name 192.168.1.1 testIp3
umesh 192.168.1.2 testIp4

我可以创建的正则表达式:

^(?:name|names)(?:\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\S+))

这是我的 perl 代码 sn-p:

while( $data =~ /^(?:name|names)(?:\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\S+))/mg) {
    $LOGGER->debug("IPs : $1 : $2");
}

在下面的截图中,请检查 ip2.2.2.2 测试IP2在 regex101 工具中不匹配:

【问题讨论】:

  • 1.1.1.1 测试IP1 2.2.2.2 测试IP2 192.168.1.1 测试IP3
  • 那么name 有一个 IP 和一个名字,names 有一对列表?
  • 你如何解析这个?请edit你的问题,并在你的比赛中包含 Perl 代码。
  • 是的,基本上我想要我的 perl 脚本中的 IP、名称对。
  • @simbabque,我已经用 perl 代码 sn-p 和正则表达式 101 的屏幕截图更新了问题,也许这会有所帮助。谢谢

标签: regex perl


【解决方案1】:

如果可以有任意数量的重复,最好提取标记,然后使用非常简单的正则表达式循环遍历它们。

if($data =~ /^names?(?:s+(d{1,3}.d{1,3}.d{1,3}.d{1,3})s+(S+))/) {
    my $match = $1;
    while (s/$match/^(d{1,3}(.d{1,3}){3})s+/) {
      $LOGGER->debug("IPs : $1 : $2");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多