Disons que j'ai une chaîne telle que:
"Hello how are you doing?"
Je voudrais une fonction qui transforme plusieurs espaces en un seul espace.
Alors j'aurais:
"Hello how are you doing?"
Je sais que je pourrais utiliser l'expression régulière ou appeler
string s = "Hello how are you doing?".replace(" "," ");
Mais je devrais l'appeler plusieurs fois pour m'assurer que tous les espaces séquentiels sont remplacés par un seul.
Existe-t-il déjà une méthode intégrée pour cela?
c#
string
whitespace
Mat
la source
la source
Réponses:
la source
Cette question n'est pas aussi simple que d'autres affiches l'ont prétendu (et comme je le croyais au départ) - parce que la question n'est pas aussi précise qu'elle le devrait.
Il y a une différence entre «espace» et «espace blanc». Si vous ne parlez que d' espaces, vous devez utiliser une expression régulière de
" {2,}"
. Si vous voulez dire des espaces, c'est une autre question. Tous les espaces doivent- ils être convertis en espaces? Que devrait-il arriver à l'espace au début et à la fin?Pour le benchmark ci-dessous, j'ai supposé que vous ne vous souciez que des espaces et que vous ne voulez rien faire sur des espaces uniques, même au début et à la fin.
Notez que l'exactitude est presque toujours plus importante que les performances. Le fait que la solution Split / Join supprime tout espace blanc de début / fin (même des espaces simples) est incorrect en ce qui concerne vos exigences spécifiées (qui peuvent être incomplètes, bien sûr).
Le benchmark utilise MiniBench .
Quelques essais:
Ici, le premier nombre est le nombre d'itérations, le second est le temps nécessaire et le troisième est un score mis à l'échelle, 1,0 étant le meilleur.
Cela montre que dans au moins certains cas (y compris celui-ci) une expression régulière peut surpasser la solution Split / Join, parfois avec une marge très significative.
Toutefois, si vous passez à une exigence « tous les espaces », puis de Split / Join ne semble gagner. Comme c'est souvent le cas, le diable est dans le détail ...
la source
Un expressoin régulier serait le moyen le plus simple. Si vous écrivez le regex correctement, vous n'aurez pas besoin de plusieurs appels.
Changez-le en ceci:
la source
@"\s{2,}"
est qu'il ne parvient pas à remplacer les onglets simples et les autres caractères d'espace Unicode par un espace. Si vous allez remplacer 2 onglets par un espace, vous devriez probablement remplacer 1 onglet par un espace.@"\s+"
fera cela pour vous.Bien que les réponses existantes soient correctes, j'aimerais souligner une approche qui ne fonctionne pas :
Cela peut boucler pour toujours. Quelqu'un veut-il deviner pourquoi? (Je n'ai rencontré cela que lorsque cela a été posé comme question de groupe de discussion il y a quelques années ... quelqu'un l'a en fait rencontré comme un problème.)
la source
Comme déjà souligné, cela se fait facilement par une expression régulière. J'ajouterai simplement que vous voudrez peut-être ajouter un .trim () à cela pour vous débarrasser des espaces de début / de fin.
la source
Voici la solution avec laquelle je travaille. Sans RegEx et String.Split.
afin que vous puissiez:
la source
Un dissolvant rapide des espaces blancs par Felipe Machado. (Modifié par RW pour la suppression de plusieurs espaces)
Les repères ...
Notes de référence: mode de sortie, aucun débogueur connecté, processeur i7, moyenne de 4 exécutions, seules les chaînes courtes testées
SwitchStmtBuildSpaceOnly par Felipe Machado 2015 et modifié par Sunsetquest
InPlaceCharArraySpaceOnly par Felipe Machado 2015 et modifié par Sunsetquest
SwitchStmtBuild par Felipe Machado 2015 et modifié par Sunsetquest
SwitchStmtBuild2 par Felipe Machado 2015 et modifié par Sunsetquest
SingleSpacedTrim par David S 2013
Fubo (StringBuilder) par fubo 2014
SplitAndJoinOnSpace par Jon Skeet 2009
RegExWithCompile par Jon Skeet 2009
User214147 par user214147
RegExBrandon par Brandon
RegExNoCompile par Tim Hoolihan
Le code de référence est sur Github
la source
Je partage ce que j'utilise, car il semble que j'ai trouvé quelque chose de différent. Je l'utilise depuis un moment et c'est assez rapide pour moi. Je ne sais pas comment cela se compare aux autres. Je l'utilise dans un écrivain de fichier délimité et j'exécute de grandes tables de données un champ à la fois.
la source
En utilisant le programme de test publié par Jon Skeet, j'ai essayé de voir si je pouvais obtenir une boucle écrite à la main pour fonctionner plus rapidement.
Je peux battre NormalizeWithSplitAndJoin à chaque fois, mais seulement battre NormalizeWithRegex avec des entrées de 1000, 5.
Je n'ai pas regardé le code machine produit par la gigue, mais je suppose que le problème est le temps pris par l'appel à StringBuilder.Append () et pour faire beaucoup mieux, il faudrait utiliser un code non sécurisé.
Donc Regex.Replace () est très rapide et difficile à battre !!
la source
VB.NET
C #
Profitez de la puissance de LINQ = D
la source
string.Join(" ", myString.Split(' ').Where(s => s != " ").ToArray())
Split
pour attraper tous les espaces et supprimer laWhere
clause:myString.Split(null as char[], StringSplitOptions.RemoveEmptyEntries)
la source
La plus petite solution:
var regExp = / \ s + / g, newString = oldString.replace (regExp, '');
la source
Vous pouvez essayer ceci:
la source
Les groupes de remplacement fournissent une approche d'implants résolvant le remplacement de plusieurs caractères d' espace blanc par le même seul:
Veuillez noter que le deuxième exemple reste unique
\n
tandis que la réponse acceptée remplacerait la fin de la ligne par un espace.Si vous devez remplacer une combinaison de caractères d'espace blanc par le premier, supprimez simplement la référence arrière
\k
du motif.la source
L'utilisation d'une expression régulière, pour remplacer 2 ou plusieurs espaces blancs par un seul espace, est également une bonne solution.
Nous utilisons le modèle regex comme « \ s + ».
\ s correspond à un espace, une tabulation, une nouvelle ligne, un retour chariot, un saut de page ou une tabulation verticale.
«+» indique une ou plusieurs occurrences.
Exemple de regex
la source
Il n'y a aucun moyen intégré de faire cela. Vous pouvez essayer ceci:
Cela supprimera les blancs de début et de fin et réduira tout espace blanc interne en un seul caractère d'espacement. Si vous ne voulez vraiment réduire que les espaces, les solutions utilisant une expression régulière sont meilleures; sinon cette solution est meilleure. (Voir l' analyse effectuée par Jon Skeet.)
la source
source.ToCharArray()
puis jetez-vous le résultat?ToCharArray()
le résultat de string.Join, uniquement pour créer une nouvelle chaîne ... wow, pour que cela soit dans un post se plaignant de surcharge est tout simplement remarquable. -1.whitespace
c'est le casnew char[] { ' ' }
, cela donnera un mauvais résultat si la chaîne d'entrée commence ou se termine par un espace.