Supprimer tous les “invisibles” caractères à partir d'une chaîne?
Je suis en train d'écrire un peu de classe pour lire une liste de paires clé-valeur à partir d'un fichier et écrire dans un Dictionary<string, string>
. Ce fichier a le format suivant:
key1:value1
key2:value2
key3:value3
...
Ce devrait être assez facile à faire, mais puisque l'utilisateur doit modifier ce fichier manuellement, comment dois-je traiter avec des espaces, tabulations, sauts de ligne supplémentaires et des trucs comme ça? Je peux probablement utiliser Remplacer pour supprimer les espaces et les tabulations, mais, est-il un autre "invisible", les personnages que je suis absent?
Ou peut-être que je peux supprimer tous les caractères non alphanumériques, ":" et les sauts de ligne (depuis la ligne de saut, ce qui le séparent d'une paire de l'autre), puis supprimer tous les sauts de ligne supplémentaires. Si c', je ne sais pas comment faire pour supprimer "tout-sauf-certains" personnages.
Bien sûr, je peux aussi vérifier les erreurs comme "key1:valeur1:somethingelse". Mais des trucs comme ça n'a pas vraiment beaucoup d'importance parce que c'est évidemment la faute de l'utilisateur et je voudrais juste montrer un "format Invalide" message. J'ai juste envie de traiter avec les trucs de base, puis mettre le tout dans un bloc try/catch, juste au cas où quelque chose d'autre se passe mal.
Remarque: je n'ai PAS besoin de toute les espacements à tous, même à l'intérieur d'une clé ou une valeur.
- Les plus naturelles de la solution (il y en a évidemment beaucoup de bonnes solutions pour un problème simple) dépend de la façon dont vous lire les données à partir du fichier. Pouvez-vous poster un code snippet?
- Qu'entendez-vous par "invisible"? Sont fileformat.info/info/unicode/char/200c/index.htm (ZÉRO LARGEUR [NON] MENUISIER, un Général de la Ponctuation) ou peut-être fileformat.info/info/unicode/char/202a/index.htm (de GAUCHE À DROITE INCORPORATION d'une autre Ponctuation) invisible assez? 🙂 Et le en.wikipedia.org/wiki/... ... Comment pourriez-vous vivre sans? 🙂 🙂 Ici, il ya une question à propos de la visibilité des caractères U stackoverflow.com/questions/304483/...
Vous devez vous connecter pour publier un commentaire.
Les exigences sont trop floue. Considérer:
"Quand est un espace une valeur? clé?"
"Quand on est un délimiteur une valeur? clé?"
"Quand il y a un onglet d'une valeur? clé?"
"D'où une valeur de fin, quand un séparateur est utilisé dans le contexte d'une valeur? la touche"?
Ces problèmes, le résultat dans le code rempli avec un off et une expérience utilisateur médiocre. C'est pourquoi nous devons les règles de la langue, de la grammaire.
Définir un simple grammaire et de prendre la plus grande partie de la conjecture.
"{clé}":"{valeur}",
Ici vous avez une paire clé/valeur contenue à l'intérieur des guillemets et séparés par un délimiteur (,). Tous les étrangers caractères peut être ignoré. Vous pourriez utiliser le XML, mais cela peut effrayer les moins irritable utilisateurs.
Remarque, les guillemets ne sont pas arbitraires. Se sentir libre de le remplacer par n'importe quel ensemble de conteneurs qui ne sera pas besoin de beaucoup de s'échapper (il suffit de se méfier de la complexité).
Personnellement, je voudrais conclure en une INTERFACE utilisateur simple et sérialiser les données au format XML. Il y a des fois de ne pas le faire, mais vous m'avez donné aucune raison de ne pas.
Je l'ai fait un récemment, lorsque j'ai enfin eu énervé à trop de sans-papiers, ordures formant mauvais xml a été à venir par le biais d'un flux. Effectivement retire tout ce qui ne tombe pas entre un espace et le ~ dans la table ASCII:
Combinée avec la RegEx exemples déjà posté il devrait vous rendre où vous voulez aller.
Si vous utiliser des Regex (Expressions Régulières), vous pouvez filtrer le tout avec une fonction.
chaîne newVariable Regex.Remplacer(variable @"\s", "");
Qui permettra de supprimer des espaces, des caractères invisibles, \n et \r.
L'un des "blancs" espaces régulièrement des piqûres de nous, c'est l'espace insécable. Aussi notre système doit être compatible avec MS-Dynamique qui est beaucoup plus restrictif. Tout d'abord, j'ai créé une fonction qui trace les 8 bits les caractères approximative de 7 bits homologue, puis j'ai enlevé tout ce qui n'était pas dans le x20 x7f gamme plus limitée par la Dynamique de l'interface.
devrait faire ce travail.
La fonction Trim() supprime tous les hors de propos espaces. Notez que cette conserve les espaces à l'intérieur d'une clé ou une valeur, que vous souhaitez mai à envisager séparément.
Split(new[] { ':' }, 2)
pourrait être mieux.Vous pouvez utiliser
string.Trim()
pour supprimer les espaces blancs:Cependant, si vous souhaitez supprimer tous les espaces vides, vous pouvez utiliser des expressions régulières:
Si il n'a pas à être rapide, vous pouvez utiliser LINQ: