我有一个Scala的列表:
List[String] = List([[aaa|bbb]], [[ccc|ddd]], [[ooo|sss]])
我希望能够获得一个与原列表相同的列表,但删除了|和]之间的子字符串以及|。
因此,结果应该是:
List[String] = List([[aaa]], [[ccc]], [[ooo]])
我试图使用List制作字符串并使用replaceAll,但我想保留List。
谢谢。
val list = List("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]")
list.map(str => str.takeWhile(_ != '|') + "]]" )
[
,|
。 \|.*?]]
正则表达式来匹配需要删除的子字符串。val l = List[String]("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]")
println(l.map(x => x.replaceAll("""\|.*?(]])""", "$1")))
请查看Scala演示
我在]]
周围添加了一个捕获组,并在替换模式中使用了$1
反向引用来将]]
插入结果。
细节:
\|
- 字面意义上的|
竖线符号(由于它是字符类之外的特殊字符,因此必须进行转义).*?
- 除了换行符以外的任何零个或多个字符(]])
- 第一组捕获]]
子字符串(请注意,字符类之外的]
不需要转义,它只是与|
相反的情况)。 replaceAll("""\|[^\]]+""", "")
,则不需要捕获组,即使[]
的嵌套级别发生变化,它仍然是准确的。 - jwvh"[aa|bb]"
或者"[[[x|y]]]"
,那么你的解决方案(无论是否使用捕获组)都不能将每个[
与一个闭合的]
匹配。 - jwvh[[
+ 除了 |
以外的一些字符,然后是 |
,再然后是一些字符直到第一个 ]]
。如果提到了平衡括号,我就不会建议使用Java正则表达式解决方案,除非递归深度只有1或2级。 - Wiktor Stribiżew用]
替换|
和}
之间的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]])