44

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

对于诸如",hello"or 之类的输入"hello,",我需要输出为"hello".

在 Scala 中是否有任何内置方法可以做到这一点?

4

5 回答 5

97

尝试

val str = "  foo  "
str.trim

并查看文档。如果您也需要摆脱,角色,您可以尝试以下操作:

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"
于 2013-08-01T13:28:08.373 回答
11

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

scala>“你好”.drop(1).dropRight(1)

res4: 字符串 = 你好

drop 调用删除第一个字符,dropRight 删除最后一个字符。请注意,这不像 trim 那样“智能”。如果“hello”的开头没有任何多余的字符,则将其修剪为“ello”。如果您需要更复杂的东西,正则表达式替换可能是答案。

于 2013-08-01T13:37:17.450 回答
10

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

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

这里的使用reverse是因为没有dropRightWhile.

如果您正在查看单个可能的逗号,stripPrefix并且stripSuffix是要走的路,如 Dirk 所示。

于 2013-08-01T13:39:10.723 回答
1

有人要求一个正则表达式版本,它是这样的:

val result = " , ,, hello, ,,".replaceAll("""[,\s]+(|.*[^,\s])[,\s]+""", "'$1'")

结果是:result: String = hello

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

于 2017-10-27T12:40:53.090 回答
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仅将空格 (" ") 字符定义为无效。以下是以下输入字符串的转换结果:

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"

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

于 2015-08-19T18:29:26.957 回答