2012-01-28 11 views
29

Vorrei conoscere la regex per abbinare le parole in modo che le parole abbiano una lunghezza massima. per esempio, se una parola ha una lunghezza massima di 10 caratteri, vorrei che la regex corrisponda, ma se la lunghezza supera 10, la regex non dovrebbe corrispondere.Regex per abbinare parole di una certa lunghezza

ho cercato

^(\w{10})$ 

ma che porta mi corrisponde solo se la lunghezza minima della parola è di 10 caratteri. Se la parola è più di 10 caratteri, corrisponde ancora, ma corrisponde solo ai primi 10 caratteri.

+0

C'è un motivo per cui non vuoi semplicemente ripetere le parole e usare 'String.length()'? – MAK

+1

Sì. Questa stringa fa parte di una stringa più grande che contiene parole di diversi formati: date, email, url ecc. In un formato delimitato da tabulazioni. Sto pensando di scrivere una regex composita per abbinare l'intera linea. –

+0

Capisco. Dal momento che le parole sono delimitate da tabulazioni, non è possibile dividerle (usando 'String.split()' o 'StringTokenizer') e poi guardare ogni lunghezza di parola? – MAK

risposta

39

Penso che tu voglia \w{1,10}\b. Lo \b corrisponde a un limite di parole.

Naturalmente, è anche possibile sostituire lo \b e fare ^\w{1,10}$. Questo corrisponderà ad una parola di massimo 10 caratteri purché sia ​​l'unico contenuto della stringa. Penso che questo sia quello che stavi facendo prima.

Dato che è Java, in realtà dovrete evitare i backslash: "\\w{1,10}\\b". Probabilmente lo sapevi già, ma mi ha già ottenuto prima.

+0

Grazie. Sono sicuro che la fuga mi abbia già ottenuto prima ..: 0 L'espressione che hai fornito corrisponde ai 10 caratteri se la parola è più grande di 10. Non voglio che corrisponda se la parola supera i 10 caratteri. Una specie di opposto di \ w {10,} potresti dire ...! –

+1

@AnandHemmige: Quale espressione? Quello con a \ b' non dovrebbe corrispondere a niente se ci sono più di 10 caratteri nella parola. Lo stesso vale per quello che termina in '$'. Dovresti provare quest'ultimo se la stringa è solo una parola. –

+1

Nella mia versione VI (gvim per Windows) ho bisogno di un backslash (\\) prima di '{' perché funzioni. –

25
^\w{0,10}$ # allows words of up to 10 characters. 
^\w{5,}$ # allows words of more than 4 characters. 
^\w{5,10}$ # allows words of between 5 and 10 characters. 
+0

Speravo che il primo di questi funzionasse come una sorta di opposto di \ w {10,} ma non lo fa. –

+3

'^' e '$' ancorano la regex all'inizio e alla fine della stringa. Se vuoi estrarre submatches (parole di una certa lunghezza), allora devi usare al loro posto le ancore di limite di parola '\ b':' \ b \ w {1,10} \ b' troverà parole di lunghezza 1 a 10. –

14

Lunghezza dei caratteri da abbinare.

{n,m} n <= length <= m 
{n} length == n 
{n,} length >= n 

E per impostazione predefinita, il motore è avido per abbinare questo modello. Ad esempio, se l'input è 123456789, \ d {2,5} corrisponderà a 12345 che è con lunghezza 5.

Se si desidera che il motore ritorni quando la lunghezza di 2 corrisponde, utilizzare \ d {2,5}?

+1

Questo mi è stato utile poiché cercavo espressioni regolari per trovare parole maggiori di x. – Zenil

Problemi correlati