如何在正则表达式中使用“模式召回”模式匹配

网络工程 思科
2021-07-24 02:35:39

我想匹配此输出中的 0,特别是使用 Cisco 文档中提到的“模式调用”功能。

图案是:

Gi4/3                       0             0             0             0
Gi4/4                       0             0             0             0
Gi4/5                       0             0             0             0
Gi4/6                       0             0             0             0

我试图让它工作,但它没有输出:

switch#show int count | i (0 +)\\1\\2\\3\\4

根据这个 Cisco Doc它应该可以工作,

要创建一个调用先前模式的正则表达式,请使用括号来表示特定模式的记忆,并使用双反斜杠 (\) 后跟一个数字以重复使用记住的模式。数字指定括号在正则表达式模式中的出现。当正则表达式中有多个记忆模式时,\1表示第一个记忆模式,\2表示第二个记忆模式,以此类推。

2个回答

有几件事会导致此失败:

  1. 这是试图匹配的0五次。你第一次写出它匹配的表达式,然后它尝试再匹配四次,
  2. 这是匹配的0(带有尾随空格)最后的 0 不会有尾随空格,
  3. 这个表达式增加了记住的模式召回数,即使你只有一个模式,
  4. 模式召回只需要一个反斜杠。\\1将匹配文本“\1”。第一个反斜杠是转义字符,后面的字符是转义字符。
  5. 从技术上讲,对于尾随空格,这也将匹配,10 0 0 0但作为输出的可能性很小。但是,永远不会有以 0 开头的数字。

因此,要获得您想要的模式,这将起作用:

#show interfaces stats  | i ( +0)\1\1\1

在此表达式中,您匹配任意数量的以 0 结尾的空格,并重复 3 次。

作为模式召回如何工作的一个很好的例子。(+ 0)(+ 0)\1\2也有效。为了使这更清楚( +0)( +1)\1\2\2将匹配0 1 0 1 1

你的模式匹配问题如下;

  1. 您不需要转义“\”。
  2. 您仅捕获 1 个组,但指的是 4 个捕获的组。

你可能想要这样的东西;

show int count | i (0 +)\1\10$

它是一样的;

0 +0 +0 +0$

我不能使用(0 +)3 次 as \1\1\1,因为在最后一次之后我们没有更多的空白空间$