2012-06-26 2 views
1

Я пытаюсь дезинформировать строку, содержащую имя загруженного файла. Я делаю это, потому что файлы будут загружаться из Интернета, и, кроме того, я хочу нормализовать имена. Это то, что я до сих пор:Явное выражение регулярного выражения для дезинфекции имени загруженного файла

private String pattern = "[^0-9_a-zA-Z\\(\\)\\%\\-\\.]"; 

//Class methods & stuff 

private String sanitizeFileName(String badFileName) { 
    StringBuffer cleanFileName = new StringBuffer(); 
    Pattern filePattern = Pattern.compile(pattern); 
    Matcher fileMatcher = filePattern.matcher(badFileName); 
    boolean match = fileMatcher.find(); 
    while(match) { 
     fileMatcher.appendReplacement(cleanFileName, ""); 
     match = fileMatcher.find(); 
    } 
    return cleanFileName.substring(0, cleanFileName.length() > 250 ? 250 : cleanFileName.length());   
} 

Это работает нормально, но по странной причине расширение файла стирается. т. е. «p% Z_-... #! $() = ¡¿& + .jpg« заканчивается «p% Z _-...()».

Любая идея о том, как мне настроить мое регулярное выражение?

+1

После размещения вопроса я начал задаваться вопросом, почему Didn» t Я использую replaceAll ... – Gamb

+0

Я собирался сказать, что replaceAll это то, что я буду использовать в этой ситуации. – carmenism

+1

Вышеприведенный код может быть сведен к двухстрочному слою с помощью 'replaceAll (" [^ 0-9a-zA-Z \\ + \\. \\ (\\) _ \\ -] "," ") ' – Gamb

ответ

3

Вам понадобится Matcher # appendTail в конце вашего цикла.

+0

Действительно, appendTail сделал трюк. Дурак я :). Спасибо. – Gamb

1

Одна линии Решения:

return badFileName.replaceAll("[^0-9_a-zA-Z\\(\\)\\%\\-\\.]", ""); 

Если вы хотите ограничить его только буквенно-цифровые и пространство:

return badFileName.replaceAll("[^a-zA-Z0-9 ]", ""); 

Приветствие :)

Смежные вопросы