Scala字符串由一组字符修剪

时间:2014-06-01 16:20:19

标签: string scala

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

val s = "un".toSet

如何按s修剪字符串,即

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

2 个答案:

答案 0 :(得分:5)

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

如果你不特别关心效率,你可以将字符从左端掉落,反转,重复和反转:

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

如果您确定自己会成为计划的瓶颈(提示:可能没有),您需要某种必要的解决方案。

答案 1 :(得分:3)

三重引号是反身的。就像纯粹的反射一样。

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