2010-10-19 4 views
41

Sto cercando di creare un'espressione regolare per avere una stringa contenente solo 0-9 come caratteri e deve contenere almeno 1 carattere di lunghezza e non più di 45. quindi l'esempio sarebbe 00303039 sarebbe una corrispondenza, e 039330a29 non lo farebbe.Regex consente a una stringa di contenere solo i numeri da 0 a 9 e la lunghezza limite a 45

Finora questo è quello che ho, ma non sono sicuro che sia corretto

[0-9]{1,45} 

Ho anche provato

^[0-9]{45}*$ 

ma che non sembra funzionare. Non ho molta familiarità con regex quindi qualsiasi aiuto sarebbe fantastico. Grazie!

risposta

129

siete quasi arrivati, tutto ciò che serve è iniziare ancoraggio (^) e ancoraggio terminale ($):

^[0-9]{1,45}$ 

\d è breve per la classe di caratteri [0-9]. È possibile utilizzarlo come:

^\d{1,45}$ 

Le ancore forzare il modello per abbinare intera di ingresso, non solo una parte di esso.


tuo regex [0-9]{1,45} cerca da 1 a 45 cifre, in modo da stringa come foo1 anche ottenere abbinato in quanto contiene 1.

^[0-9]{1,45} guarda da 1 a 45 cifre, ma queste cifre devono essere al inizio dell'ingresso. Si abbina 123 ma anche 123foo

[0-9]{1,45}$ cerca 1 a 45 cifre, ma queste cifre deve essere al fine dell'ingresso. Si abbina 123 ma anche foo123

^[0-9]{1,45}$ cerca 1 a 45 cifre, ma queste cifre devono essere sia all'inizio e alla fine dell'input, in modo efficace dovrebbe essere intero ingresso.

+0

ahh grazie, ca n spieghi cosa fanno la carota e $ per questa espressione? Basta iniziare e finire una stringa? – NewToRegEx

+0

@NewToRegEx - sì. Non consentono la visualizzazione di altri caratteri prima o dopo la corrispondenza di 1-45 cifre. – eumiro

+0

Questa dovrebbe essere la risposta? –

14

Il primo corrisponde a qualsiasi numero di cifre all'interno della stringa (consente anche ad altri caratteri, ad esempio "039330a29"). Il secondo consente solo 45 cifre (e non meno). Quindi, basta prendere il meglio da entrambi:

^\d{1,45}$ 

dove \d è lo stesso come [0-9].

+1

Se vivete in un mondo unicode (che la maggior parte delle persone fa), '\ d' è ** non ** uguale a' [0-9] '. '\ d' consente per' 4' ecc. (e migliaia di altri) di corrispondere; '[0-9]' no. –

2

^[0-9]{1,45}$ è corretto.

3

Una combinazione di entrambi i tentativi è probabilmente quello che vi serve:

^[0-9]{1,45}$ 
5

codaddict ha fornito la risposta giusta. Per quanto riguarda ciò che hai provato, vi spiego perché non fanno il taglio:

  • [0-9]{1,45} è quasi lì, tuttavia corrisponde a una stringa di 1-a-45-cifre , anche se si verifica all'interno di un'altra stringa più lunga contenente altri caratteri. Quindi è necessario ^ e $ per limitarlo a una corrispondenza esatta.

  • ^[0-9]{45}*$ corrisponde a una stringa esattamente a 45 cifre, ripetuta 0 o qualsiasi numero di volte (*). Ciò significa che la lunghezza della stringa può essere solo 0 o un multiplo di 45 (90, 135, 180 ...).

9

Utilizzare questa espressione regolare se non si vuole iniziare da zero:

^[1-9]([0-9]{1,45}$) 

Se non ti dispiace partendo da zero, l'uso:

^[0-9]{1,45}$ 
+0

Utile per la capacità di tagliare 0! –

2

Rails doesnt come l'utilizzo di^e $ per alcuni motivi di sicurezza, probabilmente il suo meglio usare \ a e \ z per impostare l'inizio e la fine della stringa