[英]Pattern Matching Scala Regex evaluation
想象一下,你有包含Ampersand符号的String,我的目标是在&和任何角色之间添加空格,如果没有
前
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& Mind
或Body& Soul &Mind
- > Body & Soul & Mind
但它不起作用,因为当案例2或3发生时,案例正在退出并且不匹配第二个&
符号。
任何人都可以帮助我如何匹配案例5和6?
您可以在&
两端捕获单个可选的空白字符,并检查它们是否匹配,并使用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,则有一个空格,我们保留它,否则,用空格替换。 尾随空间使用相同的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.