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.

¿Fue útil?

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' .
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top