【问题标题】:How to remove a substring between two specific characters in Scala如何在Scala中删除两个特定字符之间的子字符串
【发布时间】:2017-04-12 14:27:01
【问题描述】:

我在 Scala 中有这个列表:

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

我想获得与 | 之间的子字符串相同的列表和 ] 删除和 |也删除了。

所以结果是:

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

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

谢谢。

【问题讨论】:

    标签: regex string scala list


    【解决方案1】:

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

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

    假设字符串的格式为:

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

    【讨论】:

    • 这个答案可能太简短了。除了提供 MCVE,您能解释一下您的解决方案吗?来自How do I write a good answer?:“……尝试在你的回答中提及任何限制、假设或简化。简洁是可以接受的,但更全面的解释更好。”
    • 干净高效,但不是OP要求的结果。
    • 你是对的,我误读了这个问题,对此感到抱歉。我已经编辑了回复
    【解决方案2】:

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

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

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

    Scala demo

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

    详情

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

    【讨论】:

    • replaceAll("""\|[^\]]+""", "") 不需要捕获组,[] 的嵌套层次变化还是准确的。
    • @jwvh:我知道我可以用]] 代替。这只是展示正则表达式可以做什么的一种方式。
    • 当然,但如果字符串是 "[aa|bb]" 或者可能是 "[[[x|y]]]",那么您的解决方案(有或没有捕获组)将不会平衡每个 [ 与结束 ]
    • @jwvh:不需要平衡,看OP:格式是固定的,[[+|以外的一些字符,然后|,然后一些字符直到第一个]]。如果提到平衡括号,我永远不会建议使用 Java 正则表达式解决方案除非递归深度只有 1 或 2 级。
    【解决方案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]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2012-05-14
      • 2014-09-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      相关资源
      最近更新 更多