String 在Scala中修剪字符串
如何在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
“、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"