首页 > 解决方案 > 正则表达式匹配多行字符串中的字符串

问题描述

我在文本文件中有一些字符串。

line con 0
 session-timeout 10 
 exec-timeout 10 0
 privilege level 15
 logging synchronous
 login authentication console-in
 transport preferred none
 stopbits 1
line vty 0 4
 session-timeout 30 
 exec-timeout 30 0
 logging synchronous
 transport preferred none
 transport input ssh
 transport output ssh
line vty 5 15
 session-timeout 10 
 exec-timeout 10 0
 logging synchronous
 transport preferred none
 transport input ssh
 transport output ssh

我正在尝试查找/匹配

session-timeout 10
exec-timeout 10

只能在line con 0with Regex下。

line con 0.*\n(.*\n)*.*session-timeout 10.*\n(.*\n)*.*exec-timeout 10也会赶上

vty 5 15
 session-timeout 10
 exec-timeout 10

有没有办法做得更好?

标签: .netregex

解决方案


如果 2 行session-timeout 10应该exec-timeout 10按该顺序出现,则可以使用 2 个捕获组。

每个捕获组值,确保它前面的行也不会交叉匹配line ,例如 session-对于第一个匹配和 exec-第二个匹配,使用负前瞻。

^line con 0(?:\r?\n(?!line | session-).*)*\r?\n[\p{Zs}\t]*(session-timeout 10).*(?:\r?\n(?!line| exec-).*)*\r?\n[\p{Zs}\t]*(exec-timeout 10)\b
  • ^字符串的开始
  • line con 0从字面上匹配
  • (?:\r?\n(?!line | session-).*)*匹配所有不以line or开头的行 session-
  • \r?\n[\p{Zs}\t]*匹配换行符和可选空格或制表符
  • (session-timeout 10)捕获组 1,逐字匹配(或用于[0-9]+匹配 1+ 位)
  • .*匹配该行的其余部分
  • (?:\r?\n(?!line| exec-).*)*匹配所有不以line or开头的行 exec-
  • \r?\n[\p{Zs}\t]*匹配换行符和可选空格或制表符
  • (exec-timeout 10)捕获组 2,逐字匹配
  • \b防止部分匹配的单词边界

查看regex 101 演示.NET regex 演示(单击“表”选项卡查看组)


推荐阅读