微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用与这些行中的任何一行匹配的组的单个正则表达式 更长的版本

如何解决使用与这些行中的任何一行匹配的组的单个正则表达式 更长的版本

我正在寻找一个匹配这两行中任何一行的正则表达式,并捕获/分组速度和双工的值。

speed: 1000Mbps (Duplex: full)
speed: n/a

第 1 行应该具有值为“1000Mbps”的第 1 组和值为“完整”的第 2 组。第 2 行只有第 1 组,值为 'n/a'

这是我能得到的最接近的,尝试在嵌套组中使用替代。它为我获取速度值,而不是双工值。

^\s+speed:\s+(\S+)\s*(|\(Duplex:\s+(\S+)\))

更长的版本

这是用于 TextFSM 模板。我将在此处包含这些详细信息,以防使用 FSM 有一种简单的方法可以完成上述操作。

示例数据:

== [onboard]
        ==[mgmt]
                mode: static
                ip: 1.2.3.4 255.255.255.248
                ipv6: ::/0
                status: up
                speed: 1000Mbps (Duplex: full)
        ==[port1]
                mode: static
                ip: 0.0.0.0 0.0.0.0
                ipv6: ::/0
                status: down
                speed: n/a

这是我正在使用的模板文件

Value required NAME (\S+)
Value MODE (\S+)
Value IP (\d+?\.\d+?\.\d+?\.\d+?)
Value NETMASK (\S+)
Value STATUS (\S+)
Value SPEED (\S+)
Value DUPLEX (\S+)

Start
  ^==\s+\[onboard\]
  ^\s+==\[${NAME}\]
  ^\s+mode:\s+${MODE}
  ^\s+ip:\s+${IP}\s+${NETMASK}
  ^\s+ipv6:\s+.*
  ^\s+status:\s+${STATUS}
  ^\s+speed:\s+${SPEED}\s+\(Duplex:\s+${DUPLEX}\) -> Record
  ^\s*$$
  ^. -> Error

我对上述内容进行了多次尝试,包括第二行以匹配没有“双工”的“速度”。尝试让两行记录动作,或者只有一条,或者最后一条。有没有办法在 FSM 中指定 OR 类型的语句?尝试将输入行与此匹配,如果不匹配,则尝试与此匹配?

编辑:感谢您的回复。但是,我无法在 TextFSM 中使用任何这些示例。

解决方法

可以捕获这些值的正则表达式是:

(?:speed:\s)(\d+Mbps|n\/a)(?:(?:\s\(Duplex:\ (\w+)\))|$)

演示:https://regex101.com/r/DYhDXc/1/

,

为此需要注意几点:

  1. TextFSM 的重点是通过尝试使用多个正则表达式语句查找匹配项直到找到匹配项来简化正则表达式的使用。因此,每 1 个所需的捕获不需要 1 个正则表达式行。你可以简单地这样做:
  ^\s+speed:\s+${SPEED}\s+\(Duplex:\s+${DUPLEX}\) -> Record
  ^\s+speed:\s+${SPEED} -> Record

如果您只想知道如何将 regex 用于单个 regex 语句,那么其他人所说的将适用,尽管可能不太清楚,因为它严格按照 regex而与 TextFSM 无关。 ^\s+speed:\s+${SPEED}\s+\(Duplex:\s+${DUPLEX}\) 需要允许但不需要 ${SPEED} 之后的所有内容。在正则表达式中,您可以通过将此部分包装在一个组中,并在@LiamFiddler 提到的组后添加一个 ? 来实现。那只会添加 (...)?,看起来像 ^\s+speed:\s+${SPEED}(\s+\(Duplex:\s+${DUPLEX}\))?

  1. 您将记录放在非表格文本的末尾。这是不可靠的,因为硬件和软件之间的输出可能会有所不同(即使所有当前组合都有效,也不能保证在下一个版本中也会如此)。如果速度突然移动到第一个字段,那么您将在所有其他字段上落后一个。最好在第一行匹配并使用 Continue.Record
Start
  ^==\s+\[onboard\]
  ^\s+==\[\S+\] -> Continue.Record
  ^\s+==\[${NAME}\]

这将在找到新接口时记录条目,但在捕获以下条目的 ${NAME} 字段之前。由于提供了 Continue,带有接口名称的行将继续用于其他匹配项,并且它将在当前正则表达式语句 ( ^\s+==\[${NAME}\]) 之后开始查找匹配项。第一个 Record 不会有记录,因为它是空的,最后一个条目将被记录,因为 TextFSM 默认具有隐式最终 Record

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?