2011-10-21 73 views
5

編寫一個簡單的正則表達式,但我從來沒有在這方面很擅長。Java正則表達式a-z,A-Z,0-9和(。)(_)( - )

我想要做的是檢查一個字符串(文件名),以確保它只包含a-z,A-Z,0-9或特殊字符下劃線(_)句點(。)或短劃線( - )。

這裏就是我有

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

這似乎工作,但看起來不是很優雅的我。有沒有更好的/更可讀的方式來寫這個?

在此先感謝!只是試圖學習如何更好地編寫這些buggers。

- 將會

+1

其他人回答正則表達式的問題很好,但爲什麼你檢查字符串的長度大於1。如果字符串爲「」,不能匹配'「我很好奇^ +」' – kojiro

+0

好點子。這是從以前的實施中遺留下來的。謝謝! –

回答

10

你不需要在字符類中使用[]

所以,你可以寫:

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

此外,您還可以使用\\w而不是a-zA-Z0-9_

所以,正則表達式是:

^[-\\w.]+ 

而且,這個正則表達式會被消耗StackOverflow 22.10匹配字符串如StackOverflow 22.10$$2011。如果您需要字符串完全由那些性格的,你應該$結束模式 - 字符串的結尾:

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

事實上,在大多數正則表達式中,那些額外的方括號將被視爲語法錯誤。 –

+0

謝謝!這看起來好多了 –

+0

使用\\ w將允許任何UTF-8字符,而不僅僅是a-z和A-Z。另外請注意。匹配任何字符並且需要被轉義,如果你的意思是字面的'。' –

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

試試這個。

基本上\ w是[a-zA-Z_0-9]的簡寫,我只是簡單地加上你想要的其他兩個字符。

+0

我不知道Java的RE引擎,但通常你需要錨定到字​​符串的開頭,否則「@#$%@#$%foo」將被接受。 –

+0

@OscarKorz在我看到註釋m8之前已經添加了錨點: – FailedDev

+0

Java的'matches()'方法自動地錨定了兩端的匹配,但是使用顯式錨並沒有什麼壞處,我認爲這是一個很好的策略所以。雖然我沒有看到這個前瞻點(即'(?= [\\ w .-] + $)')。另外,請注意PatternSyntaxException是一個RuntimeException;你不需要抓住它。 –

0

下面是比較貴的方法(因爲它實際上觸及盤),但會跨平臺。

從本質上講,它創建一個具有給定名稱的文件,並刪除它,如果它以前不存在。如果您嘗試使用無效名稱創建文件,則會引發錯誤。所以無論你使用什麼系統,它都會告訴你文件名是否正確。

現在它違反了一般規則(使用異常來確定程序流),並且有去磁盤的缺點。但這是一種不同的方法,可能會給你可以使用的想法。

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

//docs.python.org/howto/regex.html#compilation-flags)標誌這將可能返回不同的平臺不同的結果,這是一個什麼樣的通常是跨平臺的意思,我理解它的對面。 –

+0

這個想法是它提供了一個通用的功能接口,但實現不同的平臺上。這是因爲每個人的表現都不一樣,這很好。唯一真正的問題是,當你有一個平臺告訴另一個平臺什麼是好的或什麼不是。就像我說過的那樣,這只是一種爲其他想法提供途徑的想法。 – corsiKa

相關問題