2016-01-30 5 views
1

Я создаю файлы и хотел бы создать новое имя файла, если оно уже существует, подобно тому, как OS X/windows делает с добавлением (1).Регулярное выражение, соответствующее имени файла в Scala

Я изучаю Scala в данный момент, и хотя я уверен, что есть уже метод; Мне очень хотелось бы знать, как это сделать без него.

Моя цель состоит в том, чтобы увидеть, если файл существует через private def doesFileExist(completeFilename: String) : Boolean = { logger.info("Checking if file already exists") Files.exists(Paths.get(completeFilename)) }

, а затем, если это не я хочу, чтобы добавить имя файла. Поскольку мне нужно проверить, обновлено ли имя файла, я подумал, что было бы проще всего регулярное выражение и посмотреть, есть ли что-то вроде "/^[a-zA-Z0-9_-][\\d{1,2}][a-z0-9_\\.]{3,4}$/" Который, я думаю, будет подходящим, возможно, я ошибаюсь, я не смог проверить Это. :)

Я просто не могу получить его, чтобы собрать независимо от того, сколько статей я прочитал и поэтому я не совсем уверен, как это исправить:

val RegexPattern = "/^[a-zA-Z0-9_-][\\d{1,2}][a-z0-9_\\.]{3,4}$/".r 

    if (fileName.matches(RegexPattern)) { 

    } 

это явно не удается, как это ожидает строку но я даю ему Regex. Затем я попробовал матч ...

fileName match { 
    case RegexPattern => println("Etf") 
    } 

, но это неверно. любая помощь приветствуется, спасибо.

Редактировать: Несколько иной подход после поиска примера в Интернете.

val pattern = "([0-9]+) ([A-Za-z]+)".r 
    val pattern(count, fruit) = "100 Bananas" 
    println(pattern) 
    println(count) 
    println(fruit) 



    val RegexPattern = "(.+(?=\\/))(\\/)(.+(?=\\.))".r 
    val RegexPattern(dir, delimeter, file) = "direct/ory/filename.ext" 

    println(dir + " - ") 

примечание, пример bona отлично работает, однако мой нет. Регулярное выражение действует как проверенное.

+0

См. Мой ответ здесь, где вы должны иметь parens в 'match'. http://stackoverflow.com/a/18223356/1296806 В противном случае вы просто проверяете равенство с объектом 'Regex'. –

+0

@ som-snytt Спасибо, теперь я посмотрю еще раз, это также применимо к моему обновленному подходу? – null

+0

Вы имеете в виду, что ваши изменения не работают? –

ответ

-1

Ваш val RegexPattern имеет тип scala.util.matching.RegEx. Однако метод java.lang.String#matches(String regex) принимает аргумент String. Вы должны, следовательно, не поставить регулярное выражение в Regex объект (просто опустить .r вызов в конце):

val RegexPattern = "/^[a-zA-Z0-9_-][\\d{1,2}][a-z0-9_\\.]{3,4}$/". 
+0

спасибо, но это на самом деле не работало. Если бы это было, я бы не поставил вопрос :) – null

+0

Хорошо, стоило догадываться. Я не думал, что вы уже пробовали это – Carsten

+0

. Я узнал, как нажать ctrl :) – null

0

Только в случае, если это может помочь кому-то еще:

Я не понял, что регулярное выражение должен соответствовать точной строке, с которой я сравнивал.

мой старый образец val RegexPattern = "(.+(?=\\/))(\\/)(.+(?=\\.))".r игнорировал расширение на конце. Я думал, что, видя, что меня это не волнует, мне не нужно включать его в шаблон. Глупо ожидая, что он будет соответствовать первому и опустить остальных.

Это стало ясно, когда играет с гораздо более простым примером с использованием:

val x = "(\\w)(\\w)".r 
    val x(c, s) = "an" 
    println(c, s) 

, если вы удалите «S» он жалуется, Similary если вы задница полукокса, не обновляя регулярное выражение, он жалуется. Имеет смысл в ретроспективе ...

мой рабочий шаблона с тестом:

val RegexPattern = "(.+(?=\\/))(\\/)(.+(?=\\.))(.*)".r 
    val RegexPattern(dir, delimeter, file, ext) = "direct/ory/filename.ext" 
    println(dir + " - "+ delimeter + " - " + file + " - " + ext) 

Надеется, что это помогает кто-то другое.

+0

Итак, как вы узнали, шаблон по умолчанию привязан. Вы можете использовать '' foo ".r.unanchored', поэтому выражение' match' работает без вашего дополнительного '. *'. Я был слишком ленив, чтобы понять это. –

+0

! : D Отлично, спасибо! Я все еще на полпути, теперь нужно выяснить, есть ли у файла (2) после него, чтобы я мог его обновить, пытаясь сопоставить это время :) – null

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