用一组字符对Scala字符串进行修剪

4

针对任何一组(尾部)字符,例如

val s = "un".toSet

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

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

我猜我匆忙回答了。如何指定应基于字符集修剪前缀或后缀?来自集合的任何字符?集合中的所有字符?从示例中看,顺序似乎并不重要。例如,如何确定在上面的示例中,“stringnu”.trimBy(s)是“string”而不是“stri”? - maasg
@maasg 任何元素在集合中可以出现任意次数,无论顺序如何,但仅限于字符串的开头或结尾,即尾随字符集。 - elm
2个回答

5
Scala有一个dropWhile可以解决问题的一半。它还有一个dropRight,它是集合右端的drop的类比。不幸的是,它没有dropWhileRight,所以你必须富有创意。
如果您不特别关心效率,可以从左端删除字符,然后反转,重复,然后再次反转:
scala> "untidy stringnu".dropWhile(s).reverse.dropWhile(s).reverse
res0: String = tidy string

如果你确信这会成为程序的瓶颈(提示:可能不是),你需要一种命令式解决方案。


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

字符串需要进行一些转义。 - som-snytt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接