这是我用split编写的一个版本:
fileName.split('.').init ++ Seq("js") mkString "."
这转换为例如foo.bar.coffee进入foo.bar.js.
我喜欢什么:
>它有效
>它不依赖于indexOf()之类的东西
>它感觉功能;)
我不喜欢的:
>它没有我希望的那么短
>它可能会让一些读者感到困惑
我怎么能写一个更简单/直接的版本?
更新:下面的答案很棒!简而言之:
>看起来我上面的原始方法并不差,虽然它没有涵盖一些极端情况,但如果你需要覆盖那些可以修复更长的表达
>另一种略短的方法使用正则表达式,根据你的正则表达式背景,它可以或多或少地具有可读性
>原始方法的语法略短(未涵盖的角点案例)如下:
fileName.split(‘.’).init:“js”mkString“.”
解决方法
我担心你实际上必须做更长时间才能做出最明智的事情:
scala> "oops".split('.').init ++ Seq("js") mkString "." res0: String = js
我们试试正则表达式:
scala> "oops".replaceAll("\\.[^.]*$",".js") res1: java.lang.String = oops
没有丢失文件名,但也没有扩展名.确认.
我们来解决它:
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
(注意文件名以句点结尾的角点情况的不同行为.)