Scala表达式替换字符串中的文件扩展名

时间:2011-01-19 01:23:50

标签: scala

这是我用split编写的一个版本:

fileName.split('.').init ++ Seq("js") mkString "."

这会改变,例如foo.bar.coffee foo.bar.js。{/ p>

我喜欢什么:

  • 工作
  • 它不依赖于indexOf()
  • 之类的东西
  • 感觉功能;)

我不喜欢的事情:

  • 它没有我希望的那么短
  • 可能会让一些读者感到困惑

如何编写更简单/更简单的版本?

更新:下面的答案很棒!简而言之:

  • 看起来我上面的原始方法并不差,虽然它没有涵盖一些角落情况,但如果你需要覆盖那些
  • 那就可以用更长的表达来修复
  • 另一种略短的方法使用正则表达式,根据你的正则表达式背景,它或多或少可读。
  • 原始方法的语法略短(未涵盖的角落案例):

    fileName.split('.').init :+ "js" mkString "."

7 个答案:

答案 0 :(得分:10)

我担心你实际上必须让它更长才能做出最明智的事情:

scala> "oops".split('.').init ++ Seq("js") mkString "."  
res0: String = js

有点意外丢失您的文件名称(至少如果您是最终用户)!

让我们试试正则表达式:

scala> "oops".replaceAll("\\.[^.]*$", ".js")
res1: java.lang.String = oops

没有丢失文件名,但也没有扩展名。的Ack。

让我们解决它:

def extensor(orig: String, ext: String) = (orig.split('.') match {
  case xs @ Array(x) => xs
  case y => y.init
}) :+ "js" mkString "."

scala> extensor("oops","js")
res2: String = oops.js

scala> extensor("oops.txt","js")
res3: String = oops.js

scala> extensor("oops...um...","js")
res4: String = oops...js

或者使用正则表达式:

scala> "oops".replaceAll("\\.[^.]*$", "") + ".js" 
res5: java.lang.String = oops.js

scala> "oops.txt".replaceAll("\\.[^.]*$", "") + ".js"
res6: java.lang.String = oops.js

scala> "oops...um...".replaceAll("\\.[^.]*$", "") + ".js"
res7: java.lang.String = oops...um...js

(注意文件名以句点结尾的角落情况的不同行为。)

答案 1 :(得分:3)

一个简单的正则表达式更换是否可以解决问题?

像:

scala> "package.file.java".replaceAll("(\\.[^\\.]*$)", ".rb") 
scala> "package.file.rb"

答案 2 :(得分:3)

lastIndexOf有什么问题?

fileName.take(1 + fileName.lastIndexOf(".")) + "js"

当然如果你想在不包含任何点时保留fileName,你需要多做一点

(if (fileName.contains('.')) fileName.take(fileName.lastIndexOf(".")) 
else fileName) + ".js"

答案 3 :(得分:3)

使用lastIndexOf非常简单,并使用包含多个点的文件名

def getFileNameWithoutExtension(fileName: String): String = {
  fileName.dropRight(fileName.length - fileName.lastIndexOf("."))
}

val fileName = "foo.bar.coffee"

getFileNameWithoutExtension(fileName) + ".js"

结果是foo.bar.js

答案 4 :(得分:2)

您始终可以在replaceAll

上使用java.lang.String方法
scala> "foo.bar.coffee".replaceAll("\\.[^.]*$", ".js")
res11: java.lang.String = foo.bar.js

它更短但可读性更低。

答案 5 :(得分:2)

所以,我会在这里寻求速度。碰巧,substring是恒定时间,因为它根本不复制字符串。所以,

((index: Int) => (
) + ".js")(fileName lastIndexOf '.')

这使用了一个闭包,它可以减慢它的速度。更快:

def addJS(fileName: String) = {
    def addJSAt(index: Int) = (
        if (index >= 0) fileName substring (0, index) 
        else fileName
    ) + ".js"

    addJSAt(fileName lastIndexOf '.')
}

编辑:碰巧,Java现在会复制substring上的字符串。

答案 6 :(得分:1)

如果您知道当前扩展名是什么,则可以执行以下操作:

def replaceExtension(fileName: String, oldExt: String, newExt: String): String =
  fileName.stripSuffix(oldExt) + newExt

// Be sure to use `.` when calling:
replaceExtension(fileName, ".javascript", ".js")