修剪Scala中的字符串

时间:2013-08-01 13:21:20

标签: string scala

如何修剪Scala中字符串的开始和结束字符

对于",hello""hello,"等输入,我需要输出为"hello"

在Scala中是否有任何内置方法可以执行此操作?

5 个答案:

答案 0 :(得分:74)

尝试

val str = "  foo  "
str.trim

并查看the documentation。如果您还需要摆脱,字符,可以尝试以下方法:

str.stripPrefix(",").stripSuffix(",").trim

另一种清理字符串前端的方法是

val ignoreable = ", \t\r\n"
str.dropWhile(c => ignorable.indexOf(c) >= 0)

也可以处理像",,, ,,hello"

这样的字符串

为了更好的衡量,这里有一个很小的功能,它可以通过字符串从左到右进行一次扫描:

def stripAll(s: String, bad: String): String = {

    @scala.annotation.tailrec def start(n: Int): String = 
        if (n == s.length) ""
        else if (bad.indexOf(s.charAt(n)) < 0) end(n, s.length)
        else start(1 + n)

    @scala.annotation.tailrec def end(a: Int, n: Int): String =
        if (n <= a) s.substring(a, n)
        else if (bad.indexOf(s.charAt(n - 1)) < 0) s.substring(a, n)
        else end(a, n - 1)

   start(0)
}

使用

stripAll(stringToCleanUp, charactersToRemove)

如,

stripAll("  , , , hello , ,,,, ", " ,") => "hello"

答案 1 :(得分:11)

要修剪字符串中的开始和结束字符,请使用drop和dropRight的混合:

  

阶&GT; “你好,”。drop(1)。dropRight(1)

     

res4:String = hello

drop调用删除第一个字符,dropRight删除最后一个字符。请注意,这不像修剪那样“聪明”。如果你在“你好”开头没有任何额外的角色,你会将它修剪为“ello”。如果你需要更复杂的东西,正则表达式替换可能就是答案。

答案 2 :(得分:8)

如果你只想修剪逗号并且两端都有多个逗号,你可以这样做:

str.dropWhile(_ == ',').reverse.dropWhile(_ == ',').reverse

此处使用reverse是因为没有dropRightWhile

如果您正在查看单个可能的逗号,则可以使用stripPrefixstripSuffix,如Dirk所示。

答案 3 :(得分:1)

鉴于您只想修剪 前缀 中的无效字符以及给定字符串的 后缀 (不扫描整个字符串),这里有一个很小的trimPrefixSuffixChars函数可以快速执行所需的效果:

def trimPrefixSuffixChars(
    string: String
  , invalidCharsFunction: (Char) => Boolean = (c) => c == ' '
): String =
  if (string.nonEmpty)
    string
      .dropWhile(char => invalidCharsFunction(char))  //trim prefix
      .reverse
      .dropWhile(char => invalidCharsFunction(char)) //trim suffix
      .reverse
  else
    string

此函数为invalidCharsFunction提供默认值,仅将空格(&#34;&#34;)定义为无效。这是以下输入字符串的转换结果:

trimPrefixSuffixChars(" Tx  ")     //returns "Tx"
trimPrefixSuffixChars(" . Tx . ")  //returns ". Tx ."
trimPrefixSuffixChars(" T x  ")    //returns "T x"
trimPrefixSuffixChars(" . T x . ") //returns ". T x ."

如果您有,您希望指定自己的invalidCharsFunction函数,然后将其传递给调用,如下所示:

trimPrefixSuffixChars(",Tx. ", (c) => !c.isLetterOrDigit)     //returns "Tx"
trimPrefixSuffixChars(" ! Tx # ", (c) => !c.isLetterOrDigit)  //returns "Tx"
trimPrefixSuffixChars(",T x. ", (c) => !c.isLetterOrDigit)    //returns "T x"
trimPrefixSuffixChars(" ! T x # ", (c) => !c.isLetterOrDigit) //returns "T x"

这试图简化其他答案中提供的一些示例解决方案。

答案 4 :(得分:0)

有人要求使用正则表达式版本,如下所示:

val trim: Regex = raw"[,\s]*(|.*[^,\s])[,\s]*".r

val result = " , ,, hello, ,," match { case trim(x) => x }

结果是:result: String = hello

正则表达式(不仅仅是在这种情况下,但总是如此)的缺点是对于那些尚未熟悉语法的人来说很难阅读。但是代码很简洁。