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
相关产品推荐
相关产品推荐

