首页 > 解决方案 > 模式匹配 Scala 正则表达式评估

问题描述

想象一下,你有一个包含 & 符号的字符串,我的目标是在 & 和任何字符之间添加空格(如果没有的话)

前任

Case 1: Body&Soul should be-->Body & Soul (working)
Case 2: Body  &Soul--> Body  & Soul (working)
Case 3: Body&  Soul -->Body &  Soul (working)
Case 4: Body&Soul&Mind -->Body & Soul & Mind (working)

Case 5: Body &Soul& Mind ---> Body & Soul & Mind (not working)
Case 6: Body& Soul &Mind ---> Body & Soul & Mind (not working)
    def replaceEmployerNameContainingAmpersand(emplName: String): String 
    = {
    val r = "(?<! )&(?! )".r.unanchored
    val r2 = "&(?! )".r.unanchored
    val r3 = "(?<! )&".r.unanchored

    emplName match {
     case r() => emplName.replaceAll("(?<! )&(?! )", " & ")

     case r2() => emplName.replaceAll("&(?! )", "& ")

     case r3() => emplName.replaceAll("(?<! )&", " &")
    }
   }

目标是修复案例 5 和 6:Body &Soul& MindBody& Soul &Mind-->Body & Soul & Mind

但它不起作用,因为当情况 2 或 3 发生时,情况正在退出并且与第二个&符号不匹配。

谁能帮助我如何匹配案例 5 和 6?

标签: regexscalapattern-matching

解决方案


您可以在 a 的两端捕获一个可选的空白字符&并检查它们是否匹配,并相应地使用替换replaceAllIn

def replaceAllIn(target: CharSequence, replacer: (Match) => String): String
使用替换函数替换所有匹配项。

请参阅Scala 演示

val s = "Body&Soul, Body  &Soul, Body&  Soul, Body&Soul&Mind, Body &Soul& Mind, Body& Soul &Mind"
val pattern = """(\s)?&(\s)?""".r
val res = pattern.replaceAllIn(s, m => (if (m.group(1) != null) m.group(1) else " ") + "&" + (if (m.group(2) != null) m.group(2) else " ") )
println(res)
// => Body & Soul, Body  & Soul, Body &  Soul, Body & Soul & Mind, Body & Soul & Mind, Body & Soul & Mind

(\s)?&(\s)?模式将单个空白字符匹配并捕获到第 1 组中,然后匹配&,然后在第 2 组中捕获可选的空白。

如果 Group 1 不为 null,则有一个空格,我们保留它,否则,用空格替换。相同的逻辑用于尾随空格。


推荐阅读