如何删除Scala中两个特定字符之间的子字符串

时间:2016-11-28 18:58:54

标签: regex string scala list

我在Scala中有这个列表:

List[String] = List([[aaa|bbb]], [[ccc|ddd]], [[ooo|sss]])

我希望获得与|之间的子串相同的List并删除和|也被删除了。

结果将是:

List[String] = List([[aaa]], [[ccc]], [[ooo]])

我尝试用List创建一个String并使用replaceAll,但我想保存List。

感谢。

3 个答案:

答案 0 :(得分:5)

这是一个性能非常好的简单解决方案:

val list = List("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]")
list.map(str => str.takeWhile(_ != '|') + "]]" )

它假定字符串的格式为:

  • 开头两个左方括号[
  • 然后是我们要提取的词,
  • 然后是管道|

答案 1 :(得分:3)

您可以使用简单的\|.*?]]正则表达式匹配您需要删除的这些子字符串。

以下是一种在Scala代码中执行替换的方法:

val l = List[String]("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]")
println(l.map(x => x.replaceAll("""\|.*?(]])""", "$1"))) 

请参阅Scala demo

我在]]周围添加了一个捕获组,并在替换模式中使用$1反向引用将]]插回到结果中。

<强>详情:

  • \| - 文字| pi [e符号(因为它是字符类的特殊字符,必须转义)
  • .*? - 除换行符号以外的任何零个或多个符号
  • (]]) - 第1组捕获]]子字符串(请注意,字符类之外的]不需要转义,这与|的情况正好相反)。

答案 2 :(得分:0)

|}之间的3个字符替换为]

正则表达式为"\\|(.{3})\\]"(不要忘记逃避|}

scala> val list = List("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]")
list: List[String] = List([[aaa|bbb]], [[ccc|ddd]], [[ooo|sss]])

scala> list.map(_.replaceAll("\\|(.{3})\\]", "]"))
res16: List[String] = List([[aaa]], [[ccc]], [[ooo]])