2009-02-23 16 views
38

Attualmente sto usando questa espressione regolare ^[A-Z0-9 _]*$ per accettare lettere, numeri, spazi e caratteri di sottolineatura. Devo modificarlo per richiedere almeno un numero o una lettera da qualche parte nella stringa. Qualsiasi aiuto sarebbe apprezzato!Espressione regolare: consente lettere, numeri e spazi (con almeno una lettera o un numero)

Questo sarebbe per la convalida di nomi utente per il mio sito web. Mi piacerebbe davvero supportare il maggior numero di personaggi possibile, ma voglio solo assicurarmi di prevenire l'inserimento di codice e che i caratteri mostrino un valore per tutti gli utenti. Quindi sono decisamente aperto ai suggerimenti di validazione delle espressioni regolari che supportano un insieme più ampio di caratteri.

+0

i s sgancio il trattino basso per qualche motivo, ma ottieni il punto .. – makeee

+0

@makeee segna la regex come codice (circondalo di 'caratteri) e starai bene. –

+0

Oppure fai quello che ho fatto, sfuggi alla sottolineatura con una "\". – paxdiablo

risposta

53

è sufficiente specificare il RE corrente, seguita da una lettera/numero seguito da vostro attuale RE ancora:

^[A-Z0-9 _]*[A-Z0-9][A-Z0-9 _]*$ 

Dal momento che hai ora dichiarato che sono Javascript RE, c'è un sito utile here dove puoi testare la RE contro i dati di input.

Se volete lettere minuscole così:

^[A-Za-z0-9 _]*[A-Za-z0-9][A-Za-z0-9 _]*$ 
+0

Su una puntura come "___ ___ ___", una che non contiene nessuno dei numeri o delle lettere richiesti, la regex che hai provato proverà molte combinazioni che non possono funzionare. Penso che proverà su n combinazioni. La risposta di Daniel L'funziona meglio. – SingleNegationElimination

+0

Sarebbe un motore RE piuttosto sofisticato, @token. La maggior parte di quelli che ho visto hanno le ottimizzazioni per cercare prima determinati valori, come ^, $ e [A-Z0-9]. Le ricerche di backtracking diventano necessarie solo dopo che tutte queste altre condizioni sono soddisfatte. Non soddisfatto significa nessuna corrispondenza. – paxdiablo

+0

Non funziona su stringhe come 'AA', '99', '_999_888', ... –

9
^[ _]*[A-Z0-9][A-Z0-9 _]*$ 

Opzionalmente si può avere alcuni spazi o di sottolineatura in anticipo, allora avete bisogno di una lettera o un numero, e quindi un numero arbitrario di numeri, lettere, spazi o sottolineature dopo.

Qualcosa che contiene solo spazi e caratteri di sottolineatura fallirà la porzione [A-Z0-9].

+0

Non funziona su stringhe come "A", "9", "AA", "AA", " 99 ',' _ 999_888 ',' AAA_SS S ' –

+0

Non credo che tu abbia provato questo, Renaud, altrimenti sapresti che era falso. – paxdiablo

+0

Ho, e hai solo bisogno di guardare la regex (la corrente comunque) per vedere che corrisponderebbe ad una semplice stringa come 'A' –

7

È possibile utilizzare un lookaround:

^(?=.*[A-Za-z0-9])[A-Za-z0-9 _]*$ 

Controllerà avanti che la stringa ha una lettera o un numero, se lo fa lo farà controlla che il resto dei caratteri soddisfi le tue esigenze. Questo può probabilmente essere migliorato, ma sembra funzionare con i miei test.

UPDATE:

Aggiunta modifications suggerito da Chris Lutz:

^(?=.*[^\W_])[\w ]*$/ 
+1

Non si dovrebbe usare \ s. Ha detto che vuole spazi, ma non ha menzionato le schede. mentre ci siamo, perché non usare [^ \ W_] invece di [A-Za-z0-9]? –

+0

Grazie, ho sostituito la parte della regex con qualcosa di più esplicito.Grazie per averlo capito, – gpojd

+0

Doesn ' t lavorare su stringhe come 'A', '9', 'AA', 'AA', '99', '_ 999_888', 'AAA_SS S' –

13

di andare avanti e ottenere un punto là fuori, invece di volte usando questi:

[A-Za-z0-9 _] 
[A-Za-z0-9] 

ho due (speriamo meglio) sostituzioni per questi due:

[\w ] 
[^\W_] 

Il primo corrisponde a qualsiasi carattere di parola (alfanumerico e _, nonché Unicode) e lo spazio. Il secondo corrisponde a qualsiasi cosa che non sia un carattere non di parole o un carattere di sottolineatura (solo alfanumerico, nonché Unicode).

Se non si desidera la corrispondenza Unicode, quindi attenersi alle altre risposte. Ma questi sembrano solo più facili per gli occhi (secondo me). Prendendo la risposta "preferito" al momento della stesura e utilizzando le regex più brevi ci dà:

^[\w ]*[^\W_][\w ]*$ 

forse più leggibile, forse meno. Certamente più breve. La tua scelta.

EDIT:

Proprio come una nota, io parto dal presupposto regex in stile Perl qui. Il tuo motore regex può o non può supportare cose come \ w e \ W.

EDIT 2:

miniera Testato con il tester regex JS che qualcuno legato a e alcuni esempi di base ha funzionato bene. Non ha fatto nulla di esteso, volevo solo assicurarmi che \ w e \ W funzionassero bene in JS.

EDIT 3:

aver tentato di testare alcuni Unicode con il sito regex tester JS, ho scoperto il problema: la pagina utilizza ISO invece di Unicode. Non c'è da stupirsi che il mio input giapponese non corrisponda. Oh bene, quello non dovrebbe essere difficile da risolvere:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

O so. Non so cosa si debba fare per quanto riguarda JavaScript, ma sono sicuro che non è difficile.

+0

+1 per i buoni suggerimenti. Ho aggiornato la mia risposta per mostrarla a modo tuo. – gpojd

+0

Grazie! Quale gamma di personaggi copre unicode? Mi piacerebbe poter supportare personaggi come "à". – makeee

+0

Unicode copre praticamente tutto, anche se potrebbe essere necessario fare ancora un po 'di lavoro per far funzionare pagine Web e programmi con Unicode. –

2

per me @ "^ [\ w] + $" funziona, consenti numero, alfabeto e spazio, ma è necessario digitare almeno una lettera o un numero.

0

Questa convaliderà contro caratteri speciali e gli spazi iniziali e finali:

var strString = "Your String"; 

strString.match(/^[A-Za-z0-9][A-Za-z0-9 ]\*[A-Za-z0-9]\*$/) 
0
$("#ValuationName").bind("keypress", function (event) { 
    if (event.charCode!=0) { 
     var regex = new RegExp("^[a-zA-Z ]+$"); 
     var key = String.fromCharCode(!event.charCode ? event.which : event.charCode); 
     if (!regex.test(key)) { 
      event.preventDefault(); 
      return false; 
     } 
    } 
}); 
0

Semplicemente u può aggiungere questo ai jquery.validationEngine-en.js file di

"onlyLetterNumberSp": { 
       "regex": ^[A-Za-z0-9 _]*[A-Za-z0-9][A-Za-z0-9 _]*$, 
       "alertText": "* No special characters allowed" 
      }, 

e chiamarlo nel campo di testo come

<input type="text" class="form-control validate[required,custom[onlyLetterNumberSp]]" id="title" name="title" placeholder="Title"/> 
Problemi correlati