文字列に不正な文字が含まれているかどうかを判断することについて考えます.


プロジェクトケース
プロジェクトでは、ファイル名に中国語の文字、スペースなどの不正な文字が含まれているファイルを禁止し、circeleciの継続的な統合の中で排除するという課題があります.
その考えは簡単ですね.中国語の文字正規表現でプロジェクトのファイルパスをチェックすればいいですよね?このように私達が書いたコードは:
const str = '      ';
if(/.*[\u4e00-\u9fa5]+.*$/.test(str)){ 
    throw new Error('      ');
} 
ブラックリストとホワイトリスト
白黒リストは何ですか?本文のケースに対して、黒いリストはもちろん中国語の文字、スペースなどの不法な文字列を含んでいます.白いリストは私が欲しいのです.英語、数字、下線、英語の句点などの文字列だけが含まれています.上の考えはブラックリストの実現に基づいています.
しかし、詳しく調べてみると、ブラックリストに基づいてのチェックは極めて簡単で、上記の方法では中国語の全角を「(」と「)」と識別することができません.したがって、より厳密な方法はホワイトリストを採用して実現することです.文字列は私達が欲しいのではないかと判断し、次のように実現します.
//            、  、_、.、/、+、-、@、&    
const regex = /^[A-Z0-9a-z()~_./+-@&]*$/;

if (!regex.test(path)) {
    throw new Error('      ');
}
これで万全です.
思考
このようなモノクロリストの実現は、このケースだけではなく、例えばランダムアルゴリズムを設計しますが、このランダムアルゴリズムにはいくつかの特殊な状況を排除する必要があります.私たちの直接的な考え方はこれらの状況を排除することです.
コードが丈夫になります.