2009-05-25 20 views
12

Chcę się upewnić, ciąg ma tylko znaki w tym zakresieFiltr String

[AZ] & & [AZ] & & [0-9] & & [-]

więc wszystkie litery i liczby plus łącznik. Próbowałem to ...

C# App:

 char[] filteredChars = { ',', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '{', '}', '[', ']', ':', ';', '"', '\'', '?', '/', '.', '<', '>', '\\', '|' }; 
     string s = str.TrimStart(filteredChars); 

Ten TrimStart() wydaje się tylko do pracy z literami nie otehr znaki takie jak $% itp

Czy zaimplementować to źle? Czy jest lepszy sposób to zrobić?

prostu chcę uniknąć pętli przez indeks każdej struny za sprawdzanie, ponieważ nie będzie wiele strun do zrobienia ...

myśli?

Dzięki!

+0

Należy sprawdzić, czy dane wejściowe są poprawne, a nie to, co nie powinno zostać wykonane. Użyj Regex, aby sprawdzić ciąg znaków. – David

Odpowiedz

30

Wydaje się, że jest to doskonały powód, aby używać regular expression.

bool stringIsValid = Regex.IsMatch(inputString, @"^[a-zA-Z0-9\-]*?$"); 

W odpowiedzi na komentarz Miguel, można to zrobić, aby usunąć wszystkie niechciane znaki:

string cleanString = Regex.Replace(inputString, @"[^a-zA-Z0-9\-]", ""); 

Zauważ, że daszek (^) jest teraz umieszczony wewnątrz klasę postaci, co niweczy go (pasujące do niedozwolonego znaku).

+0

Trochę zrzeczenie się: Właśnie zrobiłem wzór z góry mojej głowy, więc może to nie być dokładnie to, co ty szukasz. Będziesz mógł znaleźć informacje potrzebne do zbudowania idealnego wzoru, jeśli podążysz za odnośnikiem. –

+0

Myślę, że chciał usunąć wszelkie znaki, które były niechciane, jednak ... – miguel

+3

Musisz umieścić przed infolinią @ znak, aby nie próbował uciec przed: - Regex.Replace (s, @ "[^ A-z0-9 \ -] "," "); – Joel

1

Dlaczego po prostu nie zastąpić? Trimstart usunie tylko znaki wiodące z Twojej listy ...

+0

Ponieważ wtedy muszę mieć mnóstwo zastępujących instrukcji ... – Gabe

+0

wystarczy napisać pętlę, aby zeskanować i usunąć, następnie – miguel

1

Jestem pewien, że z trochę więcej czasu można wymyślić wnioskach coś lepszego, ale to daje dobry pomysł:

public string NumberOrLetterOnly(string s) 
{ 
    string rtn = s; 
    for (int i = 0; i < s.Length; i++) 
    { 
     if (!char.IsLetterOrDigit(rtn[i]) && rtn[i] != '-') 
     { 
      rtn = rtn.Replace(rtn[i].ToString(), " "); 
     } 
    } 
    return rtn.Replace(" ", ""); 
} 
+0

Och, właśnie zauważyłem, że nie chciał pętli. Poza tym rozwiązanie regex i tak wygląda lepiej. Nie usunę jednak mojego posta, ponieważ niektóre z tych metod mogą być pomocne – Joel

3

Spróbuj następującą

public bool isStringValid(string input) { 
    if (null == input) { 
    throw new ArgumentNullException("input"); 
    } 
    return System.Text.RegularExpressions.Regex.IsMatch(input, "^[A-Za-z0-9\-]*$"); 
} 
+0

Możesz też to zrobić: return Regex.Replace (input ?? string.Empty, @ "[^ A-z0-9 \ - ] "," "); – Joel

+0

+1 za uwzględnienie pełnego zakresu –

13

Oto świetny sposób, aby to zrobić z LINQ - bez brzydkich pętle, bez skomplikowanego wyrażenia regularnego:

private string GetGoodString(string input) 
{ 
    var allowedChars = 
     Enumerable.Range('0', 10).Concat(
     Enumerable.Range('A', 26)).Concat(
     Enumerable.Range('a', 26)).Concat(
     Enumerable.Range('-', 1)); 

    var goodChars = input.Where(c => allowedChars.Contains(c)); 
    return new string(goodChars.ToArray()); 
} 

paszy "Hello, world 123?!" i zwróci "Helloworld123".

+2

Muszę powiedzieć, że to lubię, tylko dlatego, że unikasz RegExes =) +1! –