2010-03-26 19 views

risposta

11
Regex RgxUrl = new Regex("[^a-z0-9]"); 
        blnContainsSpecialCharacters = RgxUrl.IsMatch(stringToCheck); 
+9

Ti sei perso A-Z .. – Manish

+1

questo accetterà 'à', è un carattere speciale per l'OP? (naturalmente non lo è, l'OP ha già accettato la risposta) –

35

Uso String.IndexOfAny:

private static readonly char[] SpecialChars = "[email protected]#$%^&*()".ToCharArray(); 

... 

int indexOf = text.IndexOfAny(SpecialChars); 
if (indexOf == -1) 
{ 
    // No special chars 
} 

Certo che sarà anello interno - ma almeno non c'è bisogno di farlo nel codice.

+0

Ehi Jon, come penserai Mark's Byers? – Manish

+0

@Manish: Dato che è probabile che tu abbia una vasta gamma di caratteri da autorizzare, una regex è probabilmente la strada da percorrere. –

10

Invece di controllare se una stringa contiene "caratteri speciali" spesso è meglio per verificare che tutti i caratteri della stringa sono caratteri "normali", in altre parole usano una whitelist invece di una lista nera. Il motivo è che ci sono molti personaggi che potrebbero essere considerati "personaggi speciali" e se provi ad elencarli tutti ti mancheranno.

Così invece di fare quello che hai chiesto potrebbe essere meglio controllare ad esempio che la tua stringa corrisponda alla regex @"^\w+$", o qualsiasi altra cosa tu abbia bisogno.

+1

Bel pensiero ... !! – Manish

+3

@Bubblewrap: ho suggerito di usare un'espressione regolare con una lista bianca. Non è una risposta valida alla domanda? Il problema con il metodo della lista nera è il punto in cui scrive 'etc ...'. I computer non possono indovinare cosa intendi, e scrivere un elenco di tutti i caratteri speciali è IMHO il modo sbagliato di affrontare questo problema. –

+0

IMO non lo è. Senza conoscere la motivazione alla base della domanda, non si può davvero affermare che l'utilizzo di una lista bianca sia un'alternativa migliore (o addirittura valida) all'utilizzo di IndexOfAny. E la domanda era, come ho letto, specificamente sulle liste nere. – Bubblewrap

-1

Utilizzo di PHP, si può provare:

if (preg_match("[^A-Za-z0-9]", $yourString) { 
    //DO WHATEVER 
} 

Ciò restituirà true se la stringa contiene qualcosa di diverso da una lettera o un numero.

Spero che questo aiuti.

+4

La domanda è codificata C#. –

+2

Non in C#, ma ancora mi ha dato l'espressione regolare richiesta. :) – Manish

+0

@Manish: beh, questa è * una * regex - ma non quella che corrisponde esattamente alla domanda. Se avessi detto "Voglio solo includere caratteri alfanumerici e nessun accento ecc.", Allora sarebbe stato diverso. –

-1

anche ...

foreach (char character in "some*[email protected]#@!#string") 
     { 
      if(!Char.IsLetterOrDigit(character)) 
      { 
       //It is a special character. 
      } 
     } 
+2

-1, detto specifico in questione SENZA USANDO LOOP ... – Manish

0
public static bool HasSpecialCharacters(string str) 
{ 
    string specialCharacters = @"%[email protected]#$%^&*()?/>.<,:;'\|}]{[_~`+=-" +"\""; 
    char[] specialCharactersArray = specialCharacters.ToCharArray(); 

    int index = str.IndexOfAny(specialCharactersArray); 
    //index == -1 no special characters 
    if (index == -1) 
    return false; 
    else 
    return true; 
} 
1

stavo cercando di raggiungere un risultato diverso. Per creare un metodo che restituisce il carattere speciale utilizzato per separare una stringa determinata, ad esempio 1 # 4 # 5, per utilizzarlo per dividere la stessa stringa. Dato che il sistema che sto mantenendo è costruito da così tante persone diverse, e in alcuni casi, non ho idea di quale sia lo schema (di solito non ce n'è), il seguito mi ha aiutato molto. E non posso ancora votare.

public String Separator(){ 
     **String specialCharacters = "%[email protected]#$#^&*()?/>.<:;\\|}]{[_~`+=-" +"\"";** 
     char[] specialCharactersArray = specialCharacters.toCharArray(); 
     char[] a = entrada.toCharArray(); 
     for(int i = 0; i<a.length; i++){ 
      for(int y=0; y < specialCharactersArray.length; i++){ 
       if(a[i] == specialCharactersArray[y]){ 
        separator = String.valueOf(specialCharactersArray[y]); 
       } 
      } 
     } 
     return separator; 
    } 

Grazie ragazzi.

1
//apart from regex we can also use this 
string input = Console.ReadLine(); 
      char[] a = input.ToCharArray(); 
      char[] b = new char[a.Length]; 
      int count = 0; 
      for (int i = 0; i < a.Length; i++) 
      { 
       if (!Char.IsLetterOrDigit(a[i])) 
       { 
        b[count] = a[i]; 
        count++; 
       } 
      } 
      Array.Resize(ref b, count); 
      foreach(var items in b) 
      { 
       Console.WriteLine(items); 
      } 
      Console.ReadLine(); 
//it will display the special characters in the string input 
3

Ecco una breve soluzione per verificare la presenza di caratteri speciali utilizzando LINQ

private bool ContainsSpecialChars(string value) 
{ 
     var list = new[] {"~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "+", "=", "\""}; 
     return list.Any(value.Contains); 
} 
4

LINQ è il nuovo nero.

string.Any(c => char.IsSymbol(c)); 

Per IsSymbol(), simboli validi sono membri di UnicodeCategory.

  • lettere simboli, che comprendono un insieme di simboli alfanumerici matematici e simboli quali ℅, №, e ™
  • forme numero, ad esempio e deponenti
  • operatori matematici e frecce
  • simboli geometrici
  • simboli tecnici
  • modelli
  • braille
  • simboli

Edit:

Questo non cattura tutti i caratteri. Questo può integrare:

string.Any(c => !char.IsLetterOrDigit(c)); 
Problemi correlati