2010-01-23 17 views
6

ho avuto questo regex in java che abbinato sia un carattere alfanumerico o la tilde (~)Corrispondenza '_' e '-' in java regex

^([a-z0-9])+|~$

Ora devo aggiungere anche la personaggi - e _ ho provato un paio di combinazioni, nessuno dei quali lavorano, ad esempio:

^([a-zA-Z0-9_-])+|~$ ^([a-zA-Z0-9]|-|_)+|~$

Esempio stringhe di input che devono corrispondere:

woZOQNVddd

ncnW0mL14-

dEowBO_Eu7

7MyG4XqFz-

A8ft-y6hDu ~

Eventuali indizi/suggerimenti?

+0

Ci può fornire alcuni campioni di prova? Le soluzioni sembrano corrette. – Leo

+0

campioni aggiunti.Nota che ho aggiunto A-Z per far corrispondere le lettere maiuscole –

+0

God I hete regexes in java: @ –

risposta

7

- è un carattere speciale racchiuso tra parentesi quadre. Indica un intervallo. Se non si trova a nessuna delle estremità della regex, è necessario eseguire l'escape inserendo un valore \ prima di esso.

Vale la pena sottolineare un collegamento: \w è equivalente a [0-9a-zA-Z_] quindi penso che questo sia più leggibile:

^([\w-]+|~$ 
+0

In realtà ho avuto un errore di battitura. Funziona, grazie –

+0

+1 - In qualche modo era sfuggito (nessun gioco di parole intenzionale) il mio avviso che '\ w' avrebbe eguagliato anche un carattere' _'. Immagino sia così che possiamo usarlo per abbinare nomi di variabili davvero scadenti. –

+1

@ Bill: è spesso dimenticato o non conosciuto. È strano. Penso che preferirei se non fosse il caso perché non ho usato '\ w' molte volte a causa di esso ma è facile da fare' \ w_' se fosse necessario. E penso che la maggior parte delle volte non ti interessa di '_'. – cletus

3

È necessario sfuggire allo -, come \-, poiché è un carattere speciale (l'operatore di intervallo). _ è ok.

Quindi ^([a-z0-9_\-])+|~$.

Edit: la vostra String ultima ingresso non corrisponderà perché l'espressione regolare che si sta utilizzando le partite una stringa di caratteri alfanumerici (più - e _) o tilde (a causa del tubo). Ma non entrambi. Se si desidera consentire un tilde facoltativa alla fine, passare a:

^([a-z0-9_\-])+(~?)$

+0

Oppure potresti mettere il trattino come primo carattere che dice al parser di non considerarlo un delimitatore di intervallo. –

+0

Provato usando '^ ([a-zA-Z0-9 _ \\ -]) + | ~ $'. Non funziona –

+0

@Max ha provato '^ ([- a-zA-Z0-9 _]) + | ~ $'. Non funziona –

3

Se si mette la - prima, non sarà interpretato come l'indicatore di gamma.

^([-a-zA-Z0-9_])+|~$ 

Questo corrisponde a tutti i tuoi esempi, tranne l'ultimo utilizzando il seguente codice:

String str = "A8ft-y6hDu ~"; 
System.out.println("Result: " + str.matches("^([-a-zA-Z0-9_])+|~$")); 

Questo ultimo esempio non corrisponderà perché non si adatta la tua descrizione. La regex corrisponderà a qualsiasi combinazione di caratteri alfanumerici, -, e _, O un carattere ~.

+0

fallisce a 'ncnW0mL14-' –

+0

Questo perché non avevo ancora aggiunto la A-Z. Si abbina ora. –

+0

Grazie a @bill funziona! (Sto usando @ cletus dal momento che è più sintetico) –