.NET Expresión regular: Get párrafos
-
26-09-2019 - |
Pregunta
Estoy tratando de conseguir los párrafos de una cadena en C # con expresiones regulares. En los párrafos; Bloques I de cadena media que terminan con el doble o más \ r \ n. (NO HTML párrafos
) ...
Aquí es un texto de ejemplo:
Por ejemplo, este es un párrafo con un retorno de carro aquí
y una nueva línea aquí.
En este punto, segundo párrafo comienza. A fines párrafo si el doble o más \ r \ n se corresponde o
si alcanza al final de la cadena ($).
Me trató el patrón:
Regex regex = new Regex(@"(.*)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Multiline);
pero esto no funciona. Coincide con cada línea que termina con una sola \ r \ n. Lo que necesito es conseguir que todos los caracteres incluidos los retornos de carro y caracteres de nueva línea individuales hasta alcanzar un doble \ r \ n.
Solución
.*
está siendo codicioso y consumir tanto como se pueda. Su segundo conjunto de ()
tiene una $
por lo que la expresión que se utiliza es (.*)(?)
. Con el fin de hacer que el .*
no ser codicioso, siga con un ?
.
Cuando se especifica RegexOptions.Multiline, .NET se dividirá la entrada en los saltos de línea. Uso RegexOptions.Singleline para que sea el tratamiento de la entrada completa como una sola.
Regex regex = new Regex(@"(.*?)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Singleline);
Otros consejos
Un enfoque contrario será para que coincida con los separadores en lugar de los párrafos, haciendo que el problema casi trivial. Considere lo siguiente:
string[] paragraphs = Regex.Split(text, @"^\s*$", RegexOptions.Multiline);
Al dividir la cadena de entrada por líneas vacías se puede llegar fácilmente a todos los puntos. Si sólo desea líneas en blanco, sin espacios que se puede simplificar aún más, y el uso de la ^$
parretn. En ese caso, también se puede utilizar el String.split no regulares, con una serie de separadores:
string[] separators = {"\n\n", "\r\r", "\r\n\r\n"};
string[] paragraphs = text.Split(separators,
StringSplitOptions.RemoveEmptyEntries);
¿Tiene que usar una expresión regular? Herramientas como COCO / R podría hacer este trabajo bastante fácil también. Además que sólo podría llegar a ser más rápido que la generación de código en tiempo de ejecución utilizando una expresión regular.
COMPILER YourParaProcessor
// your code goes here
TOKENS
newLine= '\r'|'\n'.
paraLetter = ANY - '\n' - '\r' .
YourParaProcessor
=
{Paragraph}
.
Paragraph =
{paraLetter} '\r\n' .