2016-11-28 99 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