You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala字符串模式匹配不符合预期,如何排查问题?

调试Scala RSA私钥Base64提取失败问题

问题原因

你的代码使用了精确字面量的字符串模式匹配,要求私钥字符串必须严格符合-----BEGIN RSA PRIVATE KEY-----\r\n[Base64]\r\n-----END RSA PRIVATE KEY-----\r\n的格式,容错性极低:

  • 若私钥中的换行符是\n而非\r\n(不同系统的换行符差异),会匹配失败
  • 若Base64内容被拆分为多行(标准PEM格式的私钥通常如此),字面量匹配无法跨多行捕获内容
  • 若开头/结尾行前后存在多余空格或空白字符,也会触发不匹配

解决方案

改用正则表达式模式匹配,兼容不同换行符、多行Base64和少量格式差异,代码如下:

val privateKey =
  "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEpAIBAAKCAQEAtp/Uo28kOjROL50aajnpK25CJoVoic2bqqu6OS2baWWD9fT2ESqq8mbFxYN3O7JXbs+74YpTdg1jSUALOz9zj/H2eCF71QYvoHmdoi0iiQuy3gS16YczVvBvinSwfEnO6Wi/Xx6AC8urdr==\r\n-----END RSA PRIVATE KEY-----\r\n"

// 定义兼容PEM格式的正则表达式
val rsaPrivateKeyPattern = """-----BEGIN RSA PRIVATE KEY-----\s*(.+?)\s*-----END RSA PRIVATE KEY-----""".r

val result = privateKey match {
  case rsaPrivateKeyPattern(rawB64) => 
    // 移除Base64中的所有空白字符(换行、空格等),得到纯净的Base64串
    rawB64.replaceAll("\\s", "")
  case _ => 
    throw AEMServiceAccountError("Invalid RSA Private Key - Please check service account credentials for AEM.")
}

println(result)

正则说明

  • \s*:匹配开头/结尾行与Base64之间的任意空白字符(包括\r、\n、空格等)
  • .+?:非贪婪匹配,精准捕获BEGIN和END之间的所有内容,避免过度匹配
  • replaceAll("\\s", ""):清理Base64中的换行和空格,确保得到可直接解码的纯净Base64字符串

内容的提问来源于stack exchange,提问作者spidey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:10:30