String 在Scala中修剪字符串

String 在Scala中修剪字符串,string,scala,String,Scala,如何在Scala中修剪字符串的起始字符和结束字符 对于诸如“、hello”或“hello”之类的输入,我需要输出为“hello” 在Scala中是否有任何内置方法可以做到这一点?试试看 val str = " foo " str.trim 看一看。如果您也需要去掉,字符,您可以尝试以下方法: str.stripPrefix(",").stripSuffix(",").trim 清理字符串前端的另一种方法是 val ignoreable = ", \t\r\n" str.dropWhile

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

对于诸如
“、hello”
“hello”
之类的输入,我需要输出为
“hello”

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

试试看

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)
}
e、 g


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

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

res4:String=hello


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

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

str.dropWhile(_ == ',').reverse.dropWhile(_ == ',').reverse
这里之所以使用
reverse
,是因为没有
dropRightWhile


如果要查看一个可能的逗号,
stripPrefix
stripSuffix
是最好的选择,正如Dirk所指出的那样。

如果您只想从给定字符串的前缀后缀中删除无效字符(而不是扫描整个字符串),这里有一个很小的
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"

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

有人要求提供一个正则表达式版本,类似于:

val result=“,”您好,,”.replaceAll(“[,\s]+(|.[^,\s])[,\s]+”,“$1”)
结果是:
Result:String=hello


正则表达式的缺点(不仅在本例中,而且总是如此)是,对于一个还不熟悉语法的人来说,它很难阅读。不过,代码非常简洁。

@Dirk:你确定不能用一些简单的regexp代码来代替
tailrec
magic吗?另外,
ignorable contains c
可能更具可读性。@ErikAllik:我很确定,所有这些都可以通过正则表达式来完成(至少在这种情况下是这样)。此外:来自Scheme,我发现自己经常使用尾部递归;我认为,这是习惯的问题,而不是其他任何事情。如果不能将代码重写为普通循环,则
tailrec
注释会导致编译器给我一个错误。我觉得这很有帮助,因为我倾向于使用尾部递归,而且Java虚拟机的局限性使我能够跨(例如)函数调用正确地支持尾部递归。顺便说一句,
trim
并没有在提供的文档链接中得到真正的记录。你需要一些坚实的scala知识挖掘(或者只是实验)来了解它的功能。“子字符串”抛出java.lang.StringIndexOutOfBoundsException,所以在使用它之前你需要“如果”-不要太scala-like@CC谢谢你的建设性批评。我同意使用“if”很笨拙,并更新了我的答案,将substring替换为drop()当你有固定长度的左右修剪时,这很好也很简单。这只适用于固定数量的要删除的字符,并且取决于开头和结尾都需要修剪这一事实。这种情况很少出现。可能是这样,但OP特别询问“如何修剪字符串的起始字符和结束字符”,而不是一般的字符串修剪实用程序。此正则表达式也可以简化为
“,.hello,,”。replaceAll(“[,\s]+”,”)
@Grafluxe,这也会从字符串中间删除,这和问题的要求有些不同。嗨,Pianosaurus,我的逻辑和你的一样。请在您的REPL中随意试用<代码> VAL结果=“,你好,”。RePoTALL([“,[S] +”,“”“”] < /COD>输出<代码>结果:String=Hello “,he,llo,”.replaceAll(“[,\s]+”,“)
”,he,llo,“.replaceAll(“[,\s]+(|.[^,\s])[,\s]+”,“$1”)之间的区别。尽管我从我的答案中删除了错误,并改为使用
replaceAll
trimPrefixSuffixChars(" Tx  ")     //returns "Tx"
trimPrefixSuffixChars(" . Tx . ")  //returns ". Tx ."
trimPrefixSuffixChars(" T x  ")    //returns "T x"
trimPrefixSuffixChars(" . T x . ") //returns ". T x ."
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"