Estoy tratando de capturar el texto entre 2 delimitadores solo cuando también hay un avance de línea dentro de los delimitadores. Entonces, por ejemplo, si tenemos el siguiente texto.
Organisation Name <<me.company.name>> ABN/ACN <<me.company.abn>> Contact Name <<me.name>> <<me.PhoneNumber Another line>> Email <<me.emailAddress>>Solo quiero devolver <<me.PhoneNumber \n\n 'Otra línea>>
el \n podría estar en cualquier lugar, básicamente solo las coincidencias que tienen al menos un \n dentro de << >> e ignorar todos los demás << >>
El patrón que tengo hasta ahora es <<(. ?\n )*?>> pero esto captura todo << >> (estoy usando C#)
aquí hay un ejemplo de lo que he intentado https://regex101.com/r/sb0wCs/1
Muchas gracias por su ayuda
Puedes usar
<<((?:(?!<<|>>).)*?\n(?s:.)*?)>>Vea la demostración de expresiones regulares . Detalles :
<< - una cadena <<((?:(?!<<|>>).)*?\n(?s:.)*?) - Grupo 1:(?:(?!<<|>>).)*? - cualquier cero o más caracteres (que no sean caracteres de nueva línea) que no comiencen >> o << secuencia de caracteres, la menor cantidad posible\n - un carácter LF(?s:.)*? - cualquier cero o más caracteres (incluidos los caracteres de nueva línea), la menor cantidad posible>> - una cadena >>En su patrón <<(.*?\n*)*?>> tiene un grupo de captura y todas las partes son opcionales, incluida la nueva línea, por lo que el cuantificador no codicioso *? puede coincidir hasta la primera aparición de >>
Además, al repetir un grupo de captura, el valor del grupo contendrá el valor de la última iteración, por lo que en su lugar puede colocar el grupo de captura sin un cuantificador alrededor de la parte completa que desea capturar.
Si sus cadenas comienzan al principio de la línea, puede usar anclas y hacer coincidir al menos una sola línea en el medio que no comience con << o >>
^\s*<<(.*(?:\r?\n(?!<<|>>).*)+\r?\n)\s*>>$Explicación
^ Comienzo de cadena\s*<< Coincide con los caracteres de espacio en blanco iniciales opcionales y <<( Grupo de captura 1.* Coincide con el resto de la línea(?:\r?\n(?!<<|>>).*)+ Haga coincidir una nueva línea y repita al menos 1 línea que no comience con << o >>\r?\n Coincide con una nueva línea) Cerrar grupo 1\s*>> Coincide con los caracteres de espacio en blanco iniciales opcionales y >>$ Fin de la cadenaVea una demostración de expresiones regulares .
Puedes probar esto: <<[^>]*?\n[^>]*>>
Pruebe la expresión regular aquí: https://regex101.com/r/vD3EgE/2
<<[^>]*?\n[^>]*>> << match literal << [^>]*? match any char that is not > as few as possible \n match a newline [^>]* match any char that is not > as few as possible >> match literal >>\n entre << y >> .