按一组字符修剪字符串



给定任意(尾随)字符集,例如

val s = "un".toSet

如何通过s修剪字符串,即

"untidy stringnu".trimBy(s)
res: String = tidy string

Scala有一个dropWhile可以解决一半的问题。它也有一个dropRight,类似于drop,用于集合的右端。不幸的是,它没有dropWhileRight,所以你必须有创意。

如果你不是特别关心效率,你可以把左边的字符去掉,反转,重复,再反转:

scala> "untidy stringnu".dropWhile(s).reverse.dropWhile(s).reverse
res0: String = tidy string

如果您确定这将成为程序中的瓶颈(提示:可能不是),您将需要某种命令式解决方案。

三引号是自反的。这是纯粹的反射

scala> val s = "undo"
s: String = undo
scala> val r = s"""[$s]*(.*?)[$s]*""".r
r: scala.util.matching.Regex = [undo]*(.*?)[undo]*
scala> def f(x: String) = x match { case r(y) => y case z => z }
f: (x: String)String
scala> f("nodu some string here...donuts are goodun")
res0: String = " some string here...donuts are g"
scala> f("undoundo")
res1: String = ""

scala> val r = s"""[$s]*(?:(.*[^$s])[$s]*|$$)""".r
r: scala.util.matching.Regex = [undo]*(?:(.*[^undo])[undo]*|$)
scala> def f(x: String) = x match { case r(null) => "" case r(y) => y case z => z }
f: (x: String)String

最新更新