Estoy trabajando en un proyecto en el que tengo un fragmento de HMTL que debe limpiarse: se ha eliminado el HTML y, como resultado de la eliminación de la tabla, hay algunos extremos extraños en los que no deberían estar :-)

Los personajes tal como aparecen son

  1. un espacio al comienzo de una línea
  2. dos puntos, retorno de carro y salto de línea al final de la línea, que debe reemplazarse simplemente con dos puntos;

Actualmente estoy usando regex de la siguiente manera:

s = Regex.Replace(s, @"(:[\r\n])", ":", RegexOptions.Multiline | RegexOptions.IgnoreCase);

// gets rid of the leading space
s = Regex.Replace(s, @"(^[( )])", "", RegexOptions.Multiline | RegexOptions.IgnoreCase);

Ejemplo de lo que estoy tratando:

Tomas Adams

Solicitor
APLawyers
p:
1800 995 718
f:
07 3102 9135
a:
22 Fultam Street
 PO Box 132, Booboobawah QLD 4113

Que debería verse así:

Tomas Adams
Solicitor
APLawyers
p:1800 995 718
f:07 3102 9135
a:22 Fultam Street
PO Box 132, Booboobawah QLD 4313

Como mi intento de limpiar la cadena, pero el resultado está lejos de ser perfecto ... ¿Puede alguien ayudarme a corregir el error y lograr mi objetivo ...

[EDITAR] los personajes ofensivos

f:\r\n07 3102 9135\r\na:\r\n22 

La combinación de: \ r \ n debe ser reemplazada por dos puntos.

MTIA

Darrin

3
DWE 13 sep. 2018 a las 17:40

4 respuestas

La mejor respuesta

Puede usar

var result = Regex.Replace(s, @"(?m)^\s+|(?<=:)(?:\r?\n)+|(\r?\n){2,}", "$1")

Consulte el .NET regex demo.

Detalles

  • (?m) - igual a RegexOptions.Multiline - hace que ^ coincida con el inicio de cualquier línea aquí
  • ^ - inicio de una línea
  • \s+ - 1+ espacios en blanco
  • | - o
  • (?<=:)(?:\r?\n)+: una posición que está precedida inmediatamente por : (combinada con (?<=:) retrospectiva positiva) seguida de 1+ ocurrencias de CR y LF opcionales (se eliminan)
  • | - o
  • (\r?\n){2,}: dos o más ocurrencias consecutivas de un CR opcional seguido de un símbolo LF. Solo la última aparición se guarda en el búfer de memoria del Grupo 1, por lo tanto, el patrón de reemplazo $1 inserta esa última ocurrencia única.
1
Wiktor Stribiżew 13 sep. 2018 a las 15:53

Una solución básica sin Regex:

var lines = input.Split(new []{"\n"}, StringSplitOptions.RemoveEmptyEntries);
var output = new StringBuilder();
for (var i = 0; i < lines.Length; i++)
{
    if (lines[i].EndsWith(":")) // feel free to also check for the size
    {
        lines[i + 1] =  lines[i] + lines[i + 1];
        continue;
    }
    output.AppendLine(lines[i].Trim()); // remove space before or after a line
}

Pruébalo en línea!

1
aloisdg moving to codidact.com 13 sep. 2018 a las 15:48

Una solución de Linq sin Regex:

var tmp = string.Empty;
var output = input.Split(new []{"\n"}, StringSplitOptions.RemoveEmptyEntries).Aggregate(new StringBuilder(), (a,b) => {
    if (b.EndsWith(":")) {  // feel free to also check for the size
        tmp = b;
    }
    else {
        a.AppendLine((tmp + b).Trim()); // remove space before or after a line
        tmp = string.Empty;
    }
    return a;
});

Pruébalo en línea!

0
aloisdg moving to codidact.com 13 sep. 2018 a las 15:49

Traté de usar su expresión regular. Pude reemplazar "\ n" y ":" con la siguiente expresión regular. Esto es eliminar ":" y "\ n" al final de la línea. @ "([: \ r \ n])"

0
ashish 13 sep. 2018 a las 14:59