2016-11-28 58 views
3

删除两个特定字符之间的子字符串我有这个名单中斯卡拉:如何在斯卡拉

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

而且我想获得与之间的子同一个列表|和]删除和|也删除了。

那么结果将是:

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

我试图做的东西与列表和使用的replaceAll字符串,但我想以节省名单。

谢谢。

回答

3

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

这里是执行在Scala代码替换的方式:

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

参见Scala demo

我添加捕获组围绕]]并且在替换模式中使用的$1反向引用插入]]回到结果。

详细

  • \| - 字面| PI并[e符号(因为它是一个特殊的字符outide字符类的,它必须被转义)
  • .*? - 任何零个或多个符号以外的换行符号
  • (]]) - 组1捕捉]]子串(注意]以外的字符类不需要转义,它只是与|的情况相反)。
+0

太谢谢你了! – KonaKona

+0

如果replaceAll(“”“\ | [^ \]] +”“”,“”)',则不需要捕获组,如果'[]'嵌套的层次更改,它仍然是准确的。 – jwvh

+0

@jwvh:我知道我可以用']]来替换。这只是一种显示正则表达式可以做什么的方法。 –

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]]) 
4

这里有一个简单的解决方案,应该是在性能上相当不错:

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

它假定的格式字符串是:

  • 两个左括号[开头
  • 然后我们要提取的字
  • 然后管道|
+1

这个答案可能太简短了。除了提供一个MCVE,你能解释一下你的解决方案吗?从[*我如何写出一个好的答案?*](http://stackoverflow.com/help/how-to-answer):“...试着在答案中提到任何限制,假设或简化。简洁是可以接受的,但更全面的解释更好。“ – gfullam

+1

好的,我愿意编辑它 – Mikel

+0

清洁和高效,但不是OP要求的结果。 – jwvh