web-dev-qa-db-fra.com

Comment supprimer des caractères non alphanumériques (y compris les espaces) d'une chaîne?

Comment supprimer les caractères non alphanumériques d'une chaîne et les espaces libres en C # avec Remplacer?

Je veux garder a-z, A-Z, 0-9 et rien de plus (pas même des espaces "").

"Hello there(hello#)".Replace(regex-i-want, "");

devrait donner

"Hellotherehello"

J'ai essayé "Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", ""); mais les espaces restent.

43
James

Dans votre expression régulière, vous avez exclu les espaces d'être mis en correspondance (et vous n'avez pas utilisé Regex.Replace() que j'avais complètement ignoré ...):

result = Regex.Replace("Hello there(hello#)", @"[^A-Za-z0-9]+", "");

devrait marcher. Le + rend la regex un peu plus efficace en faisant correspondre plus d'un caractère non alphanumérique consécutif à la fois au lieu d'un par un.

Si vous souhaitez également conserver les lettres/chiffres non ASCII, utilisez l'expression régulière suivante:

@"[^\p{L}\p{N}]+"

qui laisse

BonjourmesélèvesGutenMorgenliebeSchüler

au lieu de

BonjourmeslvesGutenMorgenliebeSchler
59
Tim Pietzcker

Vous pouvez utiliser Linq pour filtrer les caractères requis:

  String source = "Hello there(hello#)";

  // "Hellotherehello"
  String result = new String(source
    .Where(ch => Char.IsLetterOrDigit(ch))
    .ToArray());

Ou

  String result = String.Concat(source
    .Where(ch => Char.IsLetterOrDigit(ch)));  

Et donc vous n'avez pas besoin de expressions régulières.

16
Dmitry Bychenko

Ou vous pouvez aussi le faire:

    public static string RemoveNonAlphanumeric(string text)
    {
        StringBuilder sb = new StringBuilder(text.Length);

        for (int i = 0; i < text.Length; i++)
        {
            char c = text[i];
            if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
                sb.Append(text[i]);
        }

        return sb.ToString();
    }

Usage:

string text = SomeClass.RemoveNonAlphanumeric("text LaLa (lol) á ñ $ 123 ٠١٢٣٤");

//text: textLaLalol123
3
Adrianne

Et comme opération de remplacement comme méthode d'extension:

public static class StringExtensions
{
    public static string ReplaceNonAlphanumeric(this string text, char replaceChar)
    {
        StringBuilder result = new StringBuilder(text.Length);

        foreach(char c in text)
        {
            if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
                result.Append(c);
            else
                result.Append(replaceChar);
        }

        return result.ToString();
    } 
}

Et test:

[TestFixture]
public sealed class StringExtensionsTests
{
    [Test]
    public void Test()
    {
        Assert.AreEqual("text_LaLa__lol________123______", "text LaLa (lol) á ñ $ 123 ٠١٢٣٤".ReplaceNonAlphanumeric('_'));
    }
}
2
Justin Caldicott

L'erreur commise ci-dessus a été d'utiliser incorrectement Replace (cela ne prend pas d'expression régulière, merci CodeInChaos).

Le code suivant doit faire ce qui a été spécifié:

Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex
string regexed = reg.Replace("Hello there(hello#)", "");

Cela donne:

regexed = "Hellotherehello"
2
James
var text = "Hello there(hello#)";

var rgx = new Regex("[^a-zA-Z0-9]");

text = rgx.Replace(text, string.Empty);
0
Michel Bechelani