簡體   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