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

4

我有一个Scala的列表:

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

我希望能够获得一个与原列表相同的列表,但删除了|和]之间的子字符串以及|。

因此,结果应该是:

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

我试图使用List制作字符串并使用replaceAll,但我想保留List。

谢谢。

3个回答

5
这里有一个简单的解决方案,性能应该相当不错:
val list = List("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]")
list.map(str => str.takeWhile(_ != '|') + "]]" )

它假设字符串的格式为:
  • 开头是两个左方括号 [,
  • 接着是我们想要提取的单词,
  • 最后是一个竖杠符号 |

1
这个答案可能太简略了。除了提供一个MCVE之外,你能否解释一下你的解决方案?来自如何撰写好的回答?:"...尽量在你的回答中提到任何限制、假设或简化。简洁是可以接受的,但更充分的解释更好。" - gfullam
干净高效,但不是OP所请求的结果。 - jwvh
你是对的,我误读了问题,很抱歉。我已经编辑了回复。 - Mikel San Vicente

4
你可以使用简单的\|.*?]]正则表达式来匹配需要删除的子字符串。
以下是在Scala代码中执行替换的方法:
val l = List[String]("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]")
println(l.map(x => x.replaceAll("""\|.*?(]])""", "$1"))) 

请查看Scala演示

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

细节

  • \| - 字面意义上的|竖线符号(由于它是字符类之外的特殊字符,因此必须进行转义)
  • .*? - 除了换行符以外的任何零个或多个字符
  • (]]) - 第一组捕获]]子字符串(请注意,字符类之外的]不需要转义,它只是与|相反的情况)。

如果您使用replaceAll("""\|[^\]]+""", ""),则不需要捕获组,即使[]的嵌套级别发生变化,它仍然是准确的。 - jwvh
@jwvh:我知道我可以用“]]”来替换。这只是展示正则表达式的一种方式。 - Wiktor Stribiżew
同意,但如果字符串是"[aa|bb]"或者"[[[x|y]]]",那么你的解决方案(无论是否使用捕获组)都不能将每个[与一个闭合的]匹配。 - jwvh
@jwvh:无需平衡,看一下原帖:格式是固定的,[[ + 除了 | 以外的一些字符,然后是 |,再然后是一些字符直到第一个 ]]。如果提到了平衡括号,我就不会建议使用Java正则表达式解决方案,除非递归深度只有1或2级。 - Wiktor Stribiżew

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

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