【问题标题】:Scala regex find and replaceScala正则表达式查找和替换
【发布时间】:2015-11-09 09:33:18
【问题描述】:

我在 scala 中使用正则表达式查找和替换部分字符串时遇到问题。

给定以下字符串:q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q[10]>20 我想用“&&”和“||”替换所有出现的“and”和“or”。

我想出的正则表达式是:.+\s((and|or)+)\s.+。但是,这似乎只能找到最后一个“和”。

当使用https://regex101.com/#pcre 时,我尝试通过添加修饰符 gU 来解决这个问题,这似乎有效。但我不确定如何在 Scala 代码中使用这些修饰符。

非常感谢任何帮助

【问题讨论】:

    标签: regex scala


    【解决方案1】:

    为什么不使用这样的解决方案:

    str.replaceAll("\\sand\\s", " && ").replaceAll("\\sor\\s", " || ")
    

    【讨论】:

      【解决方案2】:

      您可以使用 lambda 检查捕获/匹配的子字符串,并使用 if/else 语法替换为适当的替换:

      val str = "q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q[10]>20"
      val pattern = """\b(and|or)\b""".r
      val replacedStr = pattern replaceAllIn (str, m => if (m.group(1) == "or") "||" else "&&")
      println(replacedStr)
      

      code demo 的结果:q[k6.q3]>=0 && q[dist.report][0] || q[dist.report][1] && q[10]>20

      正则表达式分解:

      • \b - 字边界
      • (and|or) - andor 字母序列
      • \b - 结束词边界。

      如果两端都需要空格,请使用

      val pattern = """ (and|or) """.r
      val replacedStr = pattern replaceAllIn (str, m => if (m.group(1) == "or") " || " else " && ")
      

      another Scala demo

      【讨论】:

      • 不错的解决方案!但是,由于其简单性,我接受了@Nyavro 的答案
      • 您决定什么最适合您。简单并不总是意味着高效。
      【解决方案3】:

      您需要添加“?”在正确的地方让你的模式不情愿:

      val line = "q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q[10]>20"
      
      val regex = ".+\\s((and|or)+)\\s.+".r
      
      regex.findAllIn(line).toList
      //Produces list with one item:
      //res0: List[String] = List(q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q)
      

      对比:

      val line = "q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q[10]>20"
      
      val regex = ".+?\\s((and|or)+)\\s.+?".r
      
      regex.findAllIn(line).toList
      
      //List with 3 items:
      //res0: List[String] = List(q[k6.q3]>=0 and q, [dist.report][0] or q, [dist.report][1] and q)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-25
        • 2011-06-16
        • 1970-01-01
        • 2017-01-28
        • 2015-01-11
        • 2012-12-02
        • 1970-01-01
        相关资源
        最近更新 更多