繁体   English   中英

是否有任何正则表达式可用于标识字符串是否用Java进行了base64编码?

[英]Is there any regular expression available to identify whether a string is base64 encoded or not in java?

我经历了几次讨论,以了解如何执行此操作。 但没有找到执行此操作的确切解决方案。 我使用以下正则表达式检查字符串是否为Base64编码

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

但这并不是每次都准确。 我知道我可以使用一些try catch方法。 但这对于Java来说是昂贵的操作。 有什么确切的方法可以做到这一点。 我正在使用Java 7。

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

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

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

即使这样,除非字符串短,否则使用Base64.Decoder::decode方法尝试进行base64解码并捕获可能的异常可能比使用正则表达式进行验证更有效。 而且您拥有解码数据的潜在好处。

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


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


我知道我可以使用一些try catch方法。 但这对于Java来说是昂贵的操作。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM