2016-02-29 18 views
8

Sto sviluppando un progetto finestra mobile, è necessario scrivere un'espressione regolare per controllare il nome del repository. Requisito come segue:Qual è la differenza tra regex {m, n} e (regex) {m, n}?

  1. includere solo charatter ASCII, escludere upcase.
  2. esclusi i caratteri speciali tranne per punto (.), Trattino (-) e sottolineatura (_).
  3. inizia solo con l'alfabeto e il numero e termina anche con esso.
  4. I caratteri speciali non possono apparire in modo continuo.
  5. limite di lunghezza (min: 2, max: 255)

allora, il mio regex è:

([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255} 

ma, non può essere OK, quando il nome repository è e-e_1.1

Quando lo cambio in:

[a-z0-9]+(?:[._-][a-z0-9]+)*{2,255} 

OK.

C'è qualcuno che può spiegare? Grazie in anticipo.

+0

'regex {m, n}' corrisponde a "rege" seguito da 'm' a' n' volte "x" carattere, '(regex) {m, n}' corrisponde a "regexregexregex..regex" ('m 'per' n' volte) – Maroun

+0

@MarounMaroun regex specificare un'espressione regolare, non specificare una stringa di "regex" – xautjzd

risposta

8

Nell'espressione regolare ([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255}, il quantificatore limite {2,255} viene applicato all'intero motivo all'interno del Gruppo 1 ([a-z0-9]+(?:[._-][a-z0-9]+)*). Significa che può essere ripetuto da 2 a 255 volte. Ciò non significa che l'intera lunghezza della stringa sia limitata a 2 a 255 caratteri.

Ora, il vostro [a-z0-9]+(?:[._-][a-z0-9]+)*{2,255} regex può abbinare caratteri illimitate, anche perché la stringa corrispondente con [a-z0-9]+ può avere 1 o più caratteri. (?:[._-][a-z0-9]+)* può corrispondere a zero o più caratteri. Il quantificatore limitativo {2,255} non funziona qui nel modo in cui è necessario.

per limitare la lunghezza della stringa di input per 2 a 255 caratteri, si dovrà utilizzare un lookahead ancorato alla partenza:

^(?=.{2,255}$)[a-z0-9]+(?:[._-][a-z0-9]+)*$ 
^^^^^^^^^^^^^ 

Il (?=.{2,255}$) lookahead sarà eseguito solo una volta all'inizio della stringa e una corrispondenza verranno trovate solo se la condizione all'interno del lookahead è soddisfatta: devono essere presenti da 2 a 255 caratteri (. corrisponde a qualsiasi carattere diverso da una nuova riga, ma non è importante in quanto consente solo caratteri specifici nello schema di corrispondenza successivo) fino alla fine della stringa.

+0

grazie mille, ho imparato molto. Penso di avere una lunga strada da percorrere regex, grazie per la tua risposta! – xautjzd

+0

Il modo non deve essere lungo. Leggi l'articolo di scelta rapida [* Lookahead Example: Simple Password Validation *] (http://www.rexegg.com/regex-lookarounds.html#password) :) –

Problemi correlati