根据输出用正则表达式取值

Based on the output to get value with regular expression

有这样的输出:

RA#show segment-routing traffic-eng on-demand color detail | utility egrep Color -B 10
Sat Dec 25 11:24:22.891 JST

SR-TE On-Demand-Color database
------------------------

On-Demand Color: 20
--
 Performance-measurement:
   Reverse-path Label: Not Configured
   Delay-measurement: Disabled
   Liveness-detection: Enabled 《-------
     Profile: liveness1
     Invalidation Action: down
     Logging:
       Session State Change: Yes
 Per-flow Information:
  Default Forward Class: 0
On-Demand Color: 23
--
 Performance-measurement:
   Reverse-path Label: Not Configured
   Delay-measurement: Disabled
   Liveness-detection: Enabled  《--------
     Profile: liveness1
     Invalidation Action: down
     Logging:
       Session State Change: Yes
 Per-flow Information:
  Default Forward Class: 0
On-Demand Color: 301

regex "On-Demand Color:\s(\S+)" 可以用来提取颜色 "20,23,301",但由于 "On-Demand Color: 301" 下没有开启活体检测,所以我预计只能提取颜色“20”和“23”。是否可以通过正则表达式来实现?

是的,可以使用正则表达式执行此操作,但请注意,在这种情况下解析器可能会更好。这个想法是搜索你想要的字符串,只要它之后有“Liveness-detection: Enabled”。

正则表达式如下所示:

On-Demand Color:\s(\S+)\n.*\n.*\n.*\n.*\n.*Liveness-detection: Enabled

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

并且基本上在您找到“On-Demand Color:”字符串后它也匹配几行。这个正则表达式可以进一步简化为:

On-Demand Color:\s(\S+)(\n.*?)*Liveness-detection: Enabled

演示:https://regex101.com/r/857JQM/1

以便“Liveness-detection:”字符串可以位于预期位置之前或之后的几行。

对于第二种方法,这可能更好。

On-Demand Color:\s(\S+)(?:\n.*){5}Liveness-detection: Enabled

如果您想更灵活一点并且值可以出现在 n 行而不是正好 5 行之后,您可以使用负先行。

如果 Liveness-detection: Enabled 在当前的 On-Demand Color: 部分中不存在,这也将防止过度匹配。

On-Demand Color:\s(\S+)(?:\n(?!On-Demand Color:|\s*Liveness-detection:).*)*\n\s*Liveness-detection: Enabled

模式匹配:

  • On-Demand Color:匹配起始字符串
  • \s(\S+) 在捕获组 1
  • 中匹配一个空白字符并捕获 1+ 个非空白字符(或使用 (\d+) 数字)
  • (?:非捕获组
    • \n(?!On-Demand Color:|\s*Liveness-detection:)
    • .*匹配整行
  • )* 关闭非捕获组并可选择重复
  • \n\s*Liveness-detection: Enabled 匹配一个换行符、可选的空白字符和您要匹配的字符串

Regex demo