2011-10-21 13 views
5

Scrivere una semplice regex, ma non sono mai stato molto bravo in questo.Java Regex a-z, A-Z, 0-9 e (.) (_) (-)

Quello che sto cercando di fare è controllare una stringa (nome file) per assicurarsi che contenga solo a-z, A-Z, 0-9 o i caratteri speciali underscore (_) punto (.) O trattino (-).

Ecco quello che ho

if(filename.length() < 1 || !filename.matches("^[a-zA-Z0-9[.][_][-]]+")) 
    return false; 
else 
    return true; 

Questo sembra funzionare, ma non ha un aspetto molto elegante per me. C'è un modo migliore/più leggibile per scrivere questo?

Grazie in anticipo! Sto solo cercando di imparare a scrivere questi buggers meglio.

-Will

+1

Altri hanno risposto alla domanda regex bene, ma io sono curioso di sapere perchè si controlla la lunghezza della stringa è maggiore di 1. Se la stringa è "", non può corrispondere ' "^. +"' – kojiro

+0

Buon punto È stato lasciato da una precedente implementazione. Grazie! –

risposta

10

Non è necessario utilizzare [] nella classe di caratteri.

Quindi, è possibile scrivere:

^[-a-zA-Z0-9._]+ 

Inoltre, è possibile utilizzare al posto di \\wa-zA-Z0-9_.

Così, l'espressione regolare sarebbe:

^[-\\w.]+ 

Inoltre, questa espressione regolare corrisponderà una stringa come StackOverflow 22.10$$2011 consumando StackOverflow 22.10. Se avete bisogno della stringa consistere completamente di quelli di carattere, si dovrebbe finire il pattern con $ - alla fine della stringa:

^[-\\w.]+$ 
+0

In effetti, nella maggior parte delle espressioni di espressioni regolari queste parentesi quadre aggiuntive vengono trattate come un errore di sintassi. –

+0

Grazie! Sembra molto meglio –

+0

L'utilizzo di \\ w consente qualsiasi carattere UTF-8, non solo a-z e A-Z. Anche essere consapevoli di questo. corrisponde a qualsiasi carattere e deve essere sfuggito se si intende un 'letterale'. –

1
try { 
    boolean foundMatch = subjectString.matches("^[\\w.-]+$"); 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 

Prova questa.

Fondamentalmente \ w è una scorciatoia per [a-zA-Z_0-9] e aggiungo semplicemente gli altri due caratteri desiderati.

+0

Non conosco il motore RE di Java, ma in generale è necessario ancorare all'inizio della stringa, altrimenti verrà accettato "@ # $% @ # $% foo". –

+0

@OscarKorz Aveva già aggiunto le ancore prima che io vedessi il commento m8 :) – FailedDev

+0

Il metodo '' matches '() 'di Java aggiusta automaticamente la corrispondenza ad entrambe le estremità, ma non fa male usare gli ancoraggi espliciti, e penso che sia buona norma fare così. Non vedo il punto di questo lookahead, però (cioè, '(? = [\\ w .-] + $)').Inoltre, tieni presente che PatternSyntaxException è una RuntimeException; non sei tenuto a prenderlo. –

0

Ecco un metodo che è più costoso (perché in realtà tocca disco), ma sarà piattaforma incrociata.

In sostanza crea un file con il nome specificato e lo elimina se non esisteva in precedenza. Se si è tentato di creare un file con un nome non valido, viene generato un errore. Quindi, indipendentemente dal sistema in cui ti trovi, ti dirà se il nome del file è corretto.

Ora viola una regola generale (utilizzando le eccezioni per determinare il flusso del programma) e ha lo svantaggio di andare sul disco. Ma è un approccio diverso e potrebbe darti idee che puoi usare.

public boolean isValidFileName(final String fileName) { 
    final File file = new File(fileName); 
    final boolean isValid = true; 
    try { 
     if (file.createNewFile()) { 
      file.delete(); 
     } 
    } catch (IOException e) { 
     isValid = false; 
    } 
    return isValid; 
} 
+0

Ciò potrebbe potenzialmente restituire risultati diversi su piattaforme diverse.E 'l'opposto di ciò che di solito si intende per multipiattaforma, a quanto ho capito. –

+0

L'idea è che fornisca un'interfaccia per funzionalità comuni ma implementate in modo diverso su piattaforme diverse. È perché ognuno lo fa diversamente che funziona così bene. L'unico vero problema è quando una piattaforma dice a un'altra piattaforma cosa va bene o cosa no. E come ho detto questo solo un pensiero per dare una via per altre idee. – corsiKa

Problemi correlati