是否有任何正则表达式可用于标识字符串是否为java中的base64编码?

是否有任何正则表达式可用于标识字符串是否为java中的base64编码?,java,regex,encryption,base64,Java,Regex,Encryption,Base64,我通过几次讨论来了解如何做到这一点。但是没有找到任何精确的解决方法。我使用了下面的正则表达式来检查字符串是否是Base64编码的 ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$ 但这并非每次都准确。我知道我可以用一些试捕法。但对于java来说,这是一个昂贵的操作。有什么确切的方法可以做到这一点吗。我正在使用java 7。我建议对此要谨慎。有两个问题: 第一个问题是,当字符串不匹配时,您

我通过几次讨论来了解如何做到这一点。但是没有找到任何精确的解决方法。我使用了下面的正则表达式来检查字符串是否是Base64编码的

^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$  

但这并非每次都准确。我知道我可以用一些试捕法。但对于java来说,这是一个昂贵的操作。有什么确切的方法可以做到这一点吗。我正在使用java 7。

我建议对此要谨慎。有两个问题:

第一个问题是,当字符串不匹配时,您向我们展示的正则表达式可能会遇到性能问题。特别是,在比赛失败之前,你会得到很多不必要的回溯

(使用“不情愿”或“占有”量词而不是“贪婪”量词可以避免回溯,但您需要了解自己在做什么。)

即使如此,除非字符串很短,否则使用
base64.Decoder::decode
方法尝试base64解码并捕获可能的异常可能比使用正则表达式验证更有效。你有一个潜在的好处,那就是你有解码的数据

(可能为了加速,您可以在尝试完整的base64解码之前检查前4个和后4个字符。)


第二个问题是(理论上)字符串在语法上可能作为Base64有效,但它是由另一个“进程”生成的。因此,当您解码字符串时,可能会得到垃圾。因此,它可能值得解码字符串并检查其中的内容。。。作为验证的一部分


我知道我可以用一些试捕法。但对于java来说,这是一个昂贵的操作


这都是相对的。此外,由于(我认为)Java8中引入了一些优化,较新的JVM可以更有效地抛出和处理异常。

我建议对此要谨慎。有两个问题:

第一个问题是,当字符串不匹配时,您向我们展示的正则表达式可能会遇到性能问题。特别是,在比赛失败之前,你会得到很多不必要的回溯

(使用“不情愿”或“占有”量词而不是“贪婪”量词可以避免回溯,但您需要了解自己在做什么。)

即使如此,除非字符串很短,否则使用
base64.Decoder::decode
方法尝试base64解码并捕获可能的异常可能比使用正则表达式验证更有效。你有一个潜在的好处,那就是你有解码的数据

(可能为了加速,您可以在尝试完整的base64解码之前检查前4个和后4个字符。)


第二个问题是(理论上)字符串在语法上可能作为Base64有效,但它是由另一个“进程”生成的。因此,当您解码字符串时,可能会得到垃圾。因此,它可能值得解码字符串并检查其中的内容。。。作为验证的一部分


我知道我可以用一些试捕法。但对于java来说,这是一个昂贵的操作


这都是相对的。此外,由于(我认为)Java 8中引入了一些优化,较新的JVM可以更有效地抛出和处理异常。

任何给定字符串的base64呈现只是由64个标记组成的字母表组成的另一个字符串。是否可以对仅由给定字母表的标记组成的字符串进行正则表达式检查?对这是否意味着这样一个字符串确实是有意的base64编码的结果?不。还要注意,仅由64个标记组成的字母表并不意味着是其他字符串的合法base64编码。由于字符串长度和可能的填充以及处理方式的问题,字符串“a”本身可能不是任何东西的有效base64编码,即使它所包含的字母表可能表明不是这样


“尝试从实际内容中检测”通常是一种非常糟糕的策略(因为非常容易出错)。尽可能避免。

任何给定字符串的base64呈现只是由64个标记组成的字母表组成的另一个字符串。是否可以对仅由给定字母表的标记组成的字符串进行正则表达式检查?对这是否意味着这样一个字符串确实是有意的base64编码的结果?不。还要注意,仅由64个标记组成的字母表并不意味着是其他字符串的合法base64编码。由于字符串长度和可能的填充以及处理方式的问题,字符串“a”本身可能不是任何东西的有效base64编码,即使它所包含的字母表可能表明不是这样


“尝试从实际内容中检测”通常是一种非常糟糕的策略(因为非常容易出错)。尽可能避免。

检查正则表达式是否匹配可能与首先解码base64文本一样昂贵,甚至更多。请阅读本文,谢谢Vikrant Kashyap。它工作得更好。但是,如果加密字符串的结尾没有=号,则会出现问题。检查正则表达式是否匹配可能与首先解码base64文本一样昂贵(如果不是更多的话)。请阅读本文,谢谢Vikrant Kashyap。它工作得更好。但是,如果加密字符串的末尾没有=符号,则会出现问题。第二点的+1比第一点的+1多。因为Base64只是上下两个字母加上两个符号(取决于类型),所以很可能会出现虚假的解码。第二个点比第一个点多+1。由于Base64只是上下两个字母加上两个符号(这两个符号取决于类型),因此可能会出现虚假的解码。