Tengo una cadena en un archivo de texto.
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 sshEstoy tratando de encontrar/coincidir
session-timeout 10 exec-timeout 10 solo debajo de la line con 0 con Regex.
line con 0.*\n(.*\n)*.*session-timeout 10.*\n(.*\n)*.*exec-timeout 10 también detectará
vty 5 15 session-timeout 10 exec-timeout 10¿Hay alguna manera de hacerlo mejor?
Si las 2 líneas session-timeout 10 y exec-timeout 10 deben ocurrir en ese orden, puede usar 2 grupos de captura.
Por valor de grupo de captura, asegúrese de que las líneas que lo preceden no coincidan con ninguna line y, por ejemplo, session- , para la primera coincidencia y exec- para la segunda coincidencia mediante una búsqueda anticipada negativa.
^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^ Comienzo de cadenaline con 0 Coincide literalmente(?:\r?\n(?!line | session-).*)* Coincide con todas las líneas que no comienzan con line o session-\r?\n[\p{Zs}\t]* Coincide con una nueva línea y espacios o tabulaciones opcionales(session-timeout 10) Capture el grupo 1 , haga coincidir literalmente (o use [0-9]+ para hacer coincidir 1+ dígitos).* Coincide con el resto de la línea(?:\r?\n(?!line| exec-).*)* Coincide con todas las líneas que no comienzan con line o exec-\r?\n[\p{Zs}\t]* Coincide con una nueva línea y espacios o tabulaciones opcionales(exec-timeout 10) Grupo de captura 2 , coincide literalmente\b Un límite de palabra para evitar una coincidencia parcialVea una demostración de regex 101 y una demostración de .NET regex (haga clic en la pestaña "Tabla" para ver los grupos)
Se debe al comportamiento codicioso, que es el comportamiento predeterminado de la coincidencia de expresiones regulares (intenta expandir la coincidencia tanto como sea posible mientras coincide con el patrón). ¿Agregando ? después de los cuantificadores + o * resuelve el problema de la codicia.
Por lo tanto, utilice el patrón:
line con 0.*?\n(.*?\n)*?.*?session-timeout 10.*?\n(.*?\n)*?.*?exec-timeout 10Que trata de hacer coincidir la menor cantidad de líneas posible.
Concuerda
line con 0 session-timeout 10 exec-timeout 10