Scala中使用foldLeft结合正则替换用户名报错该如何解决?
问题排查与修复方案
故障原因
1. 用户名未替换问题
- 正则匹配规则为
${name}:\\s?[a-zA-Z0-9-_.]+,要求用户名后必须跟随冒号、可选空格及后续字符串,但测试用错误信息中仅存在独立的mary、john字符串,无冒号后缀,正则无法命中,自然不会触发替换。 - 方法内部重复定义了同名
errorMessage变量,会遮蔽方法入参,导致外部传入的错误信息无法被处理。
2. 「Anchor '$' in unexpected position」报错问题
String.replaceAll()的第二个参数为替换模板,$为模板内的特殊字符,用于引用正则捕获分组。若用户名或替换内容中包含未转义的$,就会触发锚点位置异常。- 直接用字符串插值拼接正则表达式时,若用户名包含
.、*、?等正则特殊字符,也会导致正则解析错误。
修复代码
import java.util.regex.{Matcher, Pattern} private def removeNamesFromErrorMessage(errorMessage: String): Unit = { val userNames = List("mary", "john") // 测试用错误信息,避免遮蔽入参 val testMessage = "users mary and john have not paid their fee " val newError = userNames.foldLeft(testMessage)((message, name) => { // 场景1:直接替换独立出现的用户名,用\b匹配单词边界避免部分匹配 val regex = s"\\b${Pattern.quote(name)}\\b" val replacement = Matcher.quoteReplacement("<HIDDEN USER>") message.replaceAll(regex, replacement) // 场景2:如果原需求确实是替换 用户名:xxx 格式的内容,放开以下注释即可 // val regex = s"${Pattern.quote(name)}:\\s?[a-zA-Z0-9-_.]+" // val replacement = Matcher.quoteReplacement(s"$name: <HIDDEN USER>") // message.replaceAll(regex, replacement) }) println(newError) }
运行结果
- 场景1下输出为:
users <HIDDEN USER> and <HIDDEN USER> have not paid their fee - 场景2下将测试字符串修改为
users mary:138xxxx and john:john@gmail.com have not paid their fee后,输出为:users mary: <HIDDEN USER> and john: <HIDDEN USER> have not paid their fee
无报错,替换逻辑正常。
内容的提问来源于stack exchange,提问作者SimonL
相关产品推荐
相关产品推荐

