2010-05-12 14 views
12

Sto provando a scrivere un'espressione regolare che specifica che il testo dovrebbe iniziare con una lettera, ogni carattere dovrebbe essere una lettera, un numero o un trattino basso, non ci dovrebbero essere 2 caratteri di sottolineatura in fila e dovrebbe terminare con una lettera o un numero. Al momento, l'unica cosa che ho è ^[a-zA-Z]\w[a-zA-Z1-9_] ma questo non sembra funzionare correttamente poiché ha sempre e solo 3 caratteri, e consente ripetuti trattini bassi. Inoltre, non so come specificare i requisiti per l'ultimo carattere.Espressione regolare - iniziare e terminare con una lettera, accettare solo lettere, numeri e _

+0

Che lingua/dialetto regex stai usando? –

+0

Perché la tua ultima classe di caratteri non include zeri? – SilentGhost

+0

Non ne sono sicuro. Lo sto testando su Notepad ++. Per non includere zero, è un errore. – jreid9001

risposta

6
^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$ 
4

Ecco una soluzione con un lookahead negativo (non supportata in tutti i motori regex):

^[a-zA-Z](((?!__)[a-zA-Z0-9_])*[a-zA-Z0-9])?$ 

di prova che funziona come previsto:

import re 
tests = [ 
    ('a', True), 
    ('_', False), 
    ('zz', True), 
    ('a0', True), 
    ('A_', False), 
    ('a0_b', True), 
    ('a__b', False), 
    ('a_1_c', True), 
] 

regex = '^[a-zA-Z](((?!__)[a-zA-Z0-9_])*[a-zA-Z0-9])?$' 
for test in tests: 
    is_match = re.match(regex, test[0]) is not None 
    if is_match != test[1]: 
     print "fail: " + test[0] 
0

vedendo come le regole sono abbastanza complicate, io 'suggerire quanto segue:

/^[a-z](\w*)[a-z0-9]$/i 

corrisponde all'intera stringa e acquisire intermediat e personaggi. Allora o con le funzioni stringa o la seguente espressione regolare:

/__/ 

controllo se la parte catturato ha due trattini in una riga. Per esempio in Python che sarebbe simile a questa:

>>> import re 
>>> def valid(s): 
    match = re.match(r'^[a-z](\w*)[a-z0-9]$', s, re.I) 
    if match is not None: 
     return match.group(1).count('__') == 0 
    return False 
35

mi prendo una pugnalata a esso:

/^[a-z](?:_?[a-z0-9]+)*$/i 

spiegato:

/ 
^   # match beginning of string 
[a-z]  # match a letter for the first char 
(?:   # start non-capture group 
    _?   # match 0 or 1 '_' 
    [a-z0-9]+ # match a letter or number, 1 or more times 
)*   # end non-capture group, match whole group 0 or more times 
$   # match end of string 
/i   # case insensitive flag 

Il gruppo non si prende cura di cattura a) non consentire due _ (forza almeno una lettera o un numero per gruppo) eb) solo lasciando che l'ultimo carattere sia una lettera o un numero.

Alcune stringhe di prova:

"a": match 
"_": fail 
"zz": match 
"a0": match 
"A_": fail 
"a0_b": match 
"a__b": fail 
"a_1_c": match 
+0

Questo è più utile della risposta accettata in quanto spiega cosa significa ogni carattere raggruppato/riservato. Grazie per il dettaglio dato che la regex è spesso un linguaggio alieno. –

Problemi correlati