C # Il modo migliore per sostituire x ripetuti gettoni da un gettone
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
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