Domanda

Se ho:

Some text



More text






Even more text

Qual è il modo più elegante per ottenere:

Some text

More text

Even more text

Il tutto con conoscendo il numero di gettoni ripetute

È stato utile?

Soluzione

Il metodo di farlo utilizzando le espressioni regolari sarebbe

string replaced = System.Text.RegularExpressions.Regex
    .Replace(input, @"(?:\r\n)+", "\r\n");

(La sintassi (?:...) è un gruppo non-cattura, che può essere sostituito con un gruppo di cattura (solo (...)), ma che è un po 'meno efficiente e non più leggibile, IMO).

Altri suggerimenti

Forse qualcosa di simile:

var result = string.Join("\r\n", s.Split(new[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries))

Utilizzare le espressioni regolari. Far corrispondere l'intera stringa '\ r \ n' e sostituire con un unico '\ r \ n'

La funzione è necessario:

pattern = "(\\r\\n)+";
Regex rgx = new Regex(pattern);

newString = rgx.Replace(oldString, "\r\n");

EDIT: Ci scusiamo per la mancanza + precedenza

Non so C # la sintassi, ma basta usare una semplice espressione regolare per sostituire (\ r \ n) + con (\ r \ n)

È possibile usare un'espressione regolare:

str = Regex.Replace(str, "(\r\n)+", "\r\n")

Un altro modo potrebbe essere quello di dividere sulla linea interruzioni di rimozione delle voci vuote, quindi unire nuovamente:

str = String.Join("\r\n", str.Split(new string[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries);

Considerate se è necessario utilizzare il "\r\n" letterale stringa o la costante Environment.NewLine. Questo dipende da dove i dati provengono da.

Se il \ r \ n significa ciò che fa di solito, si sta sostituendo successive righe vuote con una sola riga vuota.

Sono sicuro che ci sono strumenti a tal fine. Non saprei su C #, però.

Il modo più veloce:

Regex reg = new Regex(@"(\r\n)+");

string replacedString = reg.Replace("YOUR STRING TO BE REPLACED", Environment.NewLine);

Solo pochi giorni fa, ci era quasi la stessa domanda qui intorno a SO. Non c'era un ritorno a capo del problema, invece, dove gli spazi bianchi.

C'era anche i ragazzi chi preferisce lo Spalato, il metodo e l'altro sito utilizzando una regex Join. Così Jon fatto un confronto tra i due e ne è venuto fuori che una regex compilazione era molto più veloce.

Ma io proprio non riesco a trovare di nuovo questa domanda ...

Senza regexs (che rendono il mio mal di testa)

string RemoveRepeated(string needle, string haystack)
{
    string doubleNeedle = needle + needle;

    while (haystack.IndexOf(doubleNeedle) >= 0)
        haystack = haystack.Replace(doubleNeedle, needle);
    return haystack;
}

Con un minor numero di allocazioni di memoria

string RemoveRepeated(string needle, string haystack)
{
    if (needle == null)
        throw new ArgumentNullException("needle");

    if (haystack == null)
        throw new ArgumentNullException("haystack");

    if (needle == string.Empty || haystack == string.Empty)
        return haystack;

    string doubleNeedle = needle + needle;
    var buffer = new StringBuilder(haystack);
    int originalLength;
    do
    {
        originalLength = buffer.Length;
        buffer.Replace(doubleNeedle, needle);
    } while (originalLength != buffer.Length);

    return buffer.ToString();
}

Controlli iniziali sono ugualmente valide nella prima versione troppo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top