どのmatch all invalid Base64
文字の正規表現を作成するのですか? スタックで見つけました[^a-zA-Z0-9+/=\n\r].*$
が、試してみると、結果文字列に-
符号が付きました。私は正規表現をまったく知りません。誰かがこれが良い正規表現か悪い正規表現かを検証できますか?
10780 次
2 に答える
11
あなたの質問に対する簡単な答えは、メッセージにクラスの文字と一致するものが含まれている場合[^A-Za-z0-9+/=\s]
、無効な base-64 文字が含まれているということです。ただし、他のデータを (さまざまな目的で) base- 64 ストリーム。(これらの他の文字は、base-64 オブジェクトをデコードする前に削除されます。)
マシン命令ごとにマルチバイト ブロックを処理する、非常に高速な Base 64 エンコーディング プログラムの内部構造を作成するのを手伝うことができた幸運な人物として、いくつかのコメントを追加させてください。
- base-64 アルファベットは次のとおりです。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
=
非空白文字の合計長が 4 の倍数になるように、必要に応じて出力に 0 個以上の符号を埋め込む必要があります。- これらの等号は、base-64 メッセージの末尾にのみ出現し、多くても 2 つ存在する可能性があります。
- 空白は、タイプに関係なく無視する必要があります。通常、メッセージは特定のマージン (4 の倍数である必要があります) に折り返されますが、これは必須ではありません。Base 64 エンコーディングの目的は、任意の値、特にバイナリ データをプレーン テキストとして転送することです。理論的には、Base 64 エンコーディングを使用して電話で JPEG 画像を読み取ることもできます。
したがって、base-64 メッセージを検証するための私の提案は、正規表現を使用するだけではありません。その代わり、
- すべての空白を削除し、結果の出力の長さを呼び出します
z
。 x
base-64 のアルファベット文字の数を数えます。y
メッセージの末尾にある等号の数を数えます。y
が最大 2 の場合は有効を返し、それ以外の場合はx + y = z
無効を返します。- 注 1: パディング文字
==
またはパディング文字=
は、データの整合性を保護する目的には役立たず、それらを使用しない base-64 エンコーディングの多くの派生物があります。多くの人は、パディングは CRLF 行末シーケンスの CR 部分と同じくらい役に立たず、処理時間の無駄であると考えています。 - 注 2: MIME エンコーディングに使用されるバリアントは、base-64 アルファベット以外の文字をメッセージ ストリーム内に含めることを受け入れますが、base-64 データ オブジェクトをデコードするときに単純にそれらを破棄します。
- 注 3: 現代用語の「Base64」は非常に醜い言葉なので嫌いです。この偽の単語は、元のベース 64 ライターによって使用されることはありませんでしたが、次の 9 年間で採用されました。
- 注 1: パディング文字
このほとんどは、次のように正規表現にエンコードできます (base-64 データの最後のブロックで正確な長さをチェックする必要はありません)。
^\s*(?:(?:[A-Za-z0-9+/]{4})+\s*)*[A-Za-z0-9+/]*={0,2}\s*$
于 2013-09-06T15:58:55.137 に答える