10
votes

Comment puis-je remplacer plusieurs pauses de ligne avec un seul
?

Je remplace toutes les occurrences de \ n avec la balise , mais pour une raison quelconque, le texte entré a plusieurs \ n dans une rangée, j'ai donc besoin de les combiner.

Fondamentalement, si plus de 1 \ N se produit ensemble, remplacez-le par une seule étiquette d'une seule étiquette.

Quelqu'un peut-il m'aider avec ça?


1 commentaires

Ne sous-estimez pas vous-même. Si vous savez même ce qu'est une regex, vous connaissez probablement la réponse à cette question déjà.


3 Réponses :


3
votes

Utilisez le code suivant:

int oldLength;
do {
    oldLength = str.Length;
    str = str.Replace('\r', '\n');
    str = str.Replace("\n\n", "\n");
} while(str.Length != oldLength);

str = str.Replace("\n", "<br />");


0 commentaires

31
votes

Ceci remplacera toute séquence de récupérations de chariot ( \ r ) et / ou lignesfeeds ( \ n ) avec un seul
: xxx

Si vous souhaitez uniquement remplacer les séquences de deux éléments ou plus, la réponse simpliste consiste à utiliser le quantificateur {2,} (ce qui signifie " au moins deux répétitions ") au lieu de + (ce qui signifie" au moins une répétition "): xxx

Notez que l'expression ci-dessus traitera le Combinaison CR + LF commune en tant que séquence de deux éléments. Il est probable que vous souhaitiez traiter le CR + LF comme un seul article à la place, auquel cas l'expression devient légèrement plus compliquée: xxx


7 commentaires

\ r est pour les retours de chariot. Dans le texte formaté de Windows (DOS), vous verrez des combinaisons d'alimentation de retour de chariot / ligne sous forme de \ r \ n.


Serait-il possible de définir un minimum de 2 répétitions avant un remplacement?


Oui, c'est ce que ma réponse a été une tentative de faire. \ n \ n + le fera. Mais si vous voulez des retours de chariot inclus, cela fonctionnera à la place: (\ r \ n) (\ r \ n) +


Cela ne fonctionnerait que pour le texte de style Windows / DOS (nécessitant les deux). Selon votre moteur de regex, quelque chose comme: S / (?: \ R | \ n | \ r \ n) {2} /
/ fonctionnerait.


@Brice: Votre regex traitera \ r \ n comme une séquence de deux plutôt qu'un seul élément. Voir la troisième regex dans ma réponse, qui gère \ r , \ n ou \ r \ n et traite chacun d'eux comme un seul Objet.


@Luke Pourquoi existe-t-il un << / code> dans le 3ème segment?


@smallatom: Vous avez trouvé une faute de frappe qui est assise ici depuis plus de cinq ans! Cela fait partie d'un Attention négative assertion, mais il aurait dû lire ? plutôt que ?! << / code>. Je viens de modifier pour le réparer.



-2
votes

Notez que string.replace () est beaucoup plus rapide que d'utiliser regex: xxx


1 commentaires

Cela ne gérera pas trois nouvelles lignes; Vous devez l'appeler dans une boucle. Voir ma réponse.