首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式匹配Scala Regex求值

模式匹配Scala Regex求值
EN

Stack Overflow用户
提问于 2019-06-18 22:09:05
回答 1查看 87关注 0票数 3

假设您有包含符号的字符串&如果没有,我的目标是在&和任何字符之间添加空格

e.x

代码语言:javascript
复制
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)
代码语言:javascript
复制
    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发生时,情况是退出的,并且与第二个&符号不匹配。

有谁能帮我把第五和第六箱配起来吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-18 22:21:20

您可以在&的两端捕获一个可选空格char,并检查它们是否匹配,然后使用replaceAllIn进行相应的替换。

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

Scala演示

代码语言:javascript
复制
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,就会有一个空格,我们保留它,否则,用空格替换它。相同的逻辑用于尾随空间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56657668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档