2013-03-08 12 views
11

Vorrei limitare l'immissione del mio modulo dall'immissione di caratteri non inglesi. Ad esempio, tutti i caratteri cinesi, giapponesi, cirillici, ma anche singoli come: à, â, ù, û, ü, ô, î, ê. Sarebbe possibile? Devo impostare una localizzazione sulla mia applicazione MVC o piuttosto basta fare una validazione della casella di testo regex? Solo una nota a margine, voglio essere in grado di inserire numeri e altri personaggi. Voglio solo che questo escluda le lettere.convalida modulo solo caratteri alfabeto inglese

consigli per soddisfare, grazie

risposta

9

Per questo è necessario utilizzare le proprietà dei caratteri Unicode e blocchi. Ad ogni punto di codice Unicode sono state assegnate alcune proprietà, ad es. questo punto è una lettera. I blocchi sono intervalli di punti di codice.

Per maggiori dettagli, si veda:

quelle proprietà Unicode e blocchi sono scritti \p{Name}, dove "nome" è il nome della proprietà o blocco.

Quando è una "P" maiuscola come questa \P{Name}, quindi è la negazione della proprietà/blocco, cioè corrisponde a qualsiasi altra cosa.

Ci sono per es. alcune proprietà (solo un breve estratto):

  • L ==> Caratteri di tutte le lettere.
  • Lu ==> Lettera, maiuscolo
  • Ll ==> Lettera, minuscolo
  • N ==> Tutti i numeri. Ciò include le categorie Nd, Nl e No.
  • Pc ==> Punteggiatura, connettore
  • P ==> Tutti i caratteri di punteggiatura. Ciò include le categorie Pc, Pd, Ps, Pe, Pi, Pf e Po.
  • Sm ==> Simbolo, matematica

ci sono per esempioalcuni blocchi (solo un breve estratto):

  • 0000 - 007F ==> IsBasicLatin
  • 0400 - 04FF ==> IsCyrillic
  • 1000 - 109 F ==> IsMyanmar

Cosa Ho usato la soluzione:

\P{L} è una proprietà di carattere che corrisponde a qualsiasi carattere che non sia una lettera ("L" per Lettera)

\p{IsBasicLatin} è un blocco Unicode che corrisponde ai punti di codice 0000 - 007F

Così il vostro regex sarebbe:

^[\P{L}\p{IsBasicLatin}]+$ 

In parole povere:

Questo corrisponde a una stringa dal inizio alla fine (^ e $), quando ci sono (almeno una) solo lettere o caratteri non ASCII (punti doce 0000 - 007F)

Una breve C Metodo # prova:

string[] myStrings = { "Foobar", 
    "[email protected]!\"§$%&/()", 
    "Föobar", 
    "fóÓè" 
}; 

Regex reg = new Regex(@"^[\P{L}\p{IsBasicLatin}]+$"); 

foreach (string str in myStrings) { 
    Match result = reg.Match(str); 
    if (result.Success) 
     Console.Out.WriteLine("matched ==> " + str); 
    else 
     Console.Out.WriteLine("failed ==> " + str); 
} 

Console.ReadLine(); 

Stampe:!

abbinato ==> Foobar
abbinato ==> foo @ bar \ "§ $% & /()
non riuscito ==> Föobar
non riuscito ==> fóÓè

+0

Non '[\ P {L} \ p {IsBasicLatin}]' corrisponde a non-lettere non inglesi? Ad esempio altri tipi di cifre come? Non penso che sia stato desiderato. Sembra che voglia solo abbinare i caratteri ASCII di base. – Qtax

+0

Sì, certo. Questo è quello che ho capito, basta escludere le lettere non ASCII (e abbinare tutti gli altri caratteri Unicode). Se questa comprensione è sbagliata, la soluzione è molto semplice e già qui con la risposta accettata, ma questa è una conoscenza di base delle regex e non giustificherebbe una taglia. – stema

1

È possibile utilizzare un attributo di espressione regolare sul ViewModel per limitare che

public class MyViewModel 
{ 
    [System.ComponentModel.DataAnnotations.RegularExpression("[a-zA-Z]+")] 
    public string MyEntry 
    { 
     get; 
     set; 
    } 
} 
+0

Questo corrisponde az e AZ come circa 0-9 e altri personaggi: /.,;'[]-= e così via. –

+0

Ho aggiunto una risposta, sta andando nella direzione che ci si aspetta da "* Una risposta canonica dettagliata *" – stema

0

Questo potrebbe aiutare, non modo efficiente, ma semplice convalida non reg

foreach (char c in inputTextField) 
{ 
     if ((int)(c) > 127) 
      { 
      // expection or your logic whatever you want to return 
      } 

} 
Problemi correlati