Bien que cette réponse est conforme à la clarification des exigences spécifiées dans la générosité:
J'ai aussi besoin de supprimer tous les sauts de ligne, et ma Regex-fu est
à défaut d'. Mon bounty va à quelqu'un qui peut me donner une regex qui passe
ce test: StripWhitespace("test\r\n \r\nune\r\n\r\n") ==
"test de\r\nce"
Alors, Voici la réponse:
(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|(\r?\n)+\z
Ou dans le code C# fournis par @Chris Schmich:
string fix = Regex.Replace("test\r\n \r\nthis\r\n\r\n", @"(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|(\r?\n)+\z", string.Empty, RegexOptions.Multiline);
Maintenant, nous allons essayer de le comprendre. Il existe trois modèles optionnels ici qui je suis disposé à le remplacer avec de l' string.empty
.
-
(?<=\r?\n)(\s*$\r?\n)+
- correspond à un nombre illimité de lignes ne contenant que des espaces blancs et précédé par un saut de ligne (mais ne correspond pas à la première précédant les sauts de ligne).
-
(?<=\r?\n)(\r?\n)+
- correspond à un nombre illimité de lignes vides sans contenu qui sont précédées par un saut de ligne (mais ne correspond pas à la première précédant les sauts de ligne).
-
(\r?\n)+\z
- correspond à un nombre illimité de sauts de ligne à la fin de l'essai de chaîne (fuite des sauts de ligne que vous avez appelé de mer)
Qui répond à vos test parfaitement! Mais également satisfait les deux \r\n
et \n
saut de ligne, les styles! Faites le Test! Je crois que ce sera le plus de la réponse correcte, bien que plus simple expression passe de votre prime d'essai, cette expression ne passe plus complexes.
EDIT: @Will souligné l'existence d'une potentielle faille dans la dernière correspondance du modèle de la ci-dessus regex de ne pas correspondre à de multiples sauts de ligne contenant de l'espace blanc à la fin de la chaîne de test. Donc, nous allons changer ce dernier modèle à ceci:
\b\s+\z
\B est un mot boundry (début ou à la FIN d'un mot), le \s+ est un ou plusieurs caractères espace blanc, l' \z est la fin de la chaîne de test (fin de "fichier"). Alors maintenant, il correspond à tout l'assortiment de l'espace à la fin du fichier, y compris les tabulations et des espaces en plus de retours chariot et les sauts de ligne. J'ai testé les deux À la disposition de cas de test.
Donc, tous ensemble, maintenant, il faut:
(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|\b\s+\z
EDIT #2: Bien, il y a encore un cas possible @Wil trouvé que la dernière expression régulière ne permet pas de couvrir. Ce cas est d'intrants qui ont des sauts de ligne au début du fichier avant de tout contenu. Ainsi permet d'en ajouter un modèle pour correspondre au début du fichier.
\A\s+
- L' \A
correspondent au début du fichier, l' \s+
correspondent à un ou plusieurs caractères espace blanc.
Alors maintenant, nous avons:
\A\s+|(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|\b\s+\z
Alors maintenant, nous avons quatre modèles pour la correspondance:
- les espaces blancs au début du fichier,
- redondante des sauts de ligne contenant l'espace blanc, (ex:
\r\n \r\n\t\r\n
)
- redondant sauts de ligne avec aucun contenu, (ex:
\r\n\r\n
)
- les espaces à la fin du fichier