パス//asdf
はLINUX、UNIX、iOS、およびAndroidで有効なので、コードは既に動作しています。しかし、何らかの理由でその特定の有効なパスを無効にすることが重要な場合は、[a-z ...]文字グループの後にアスタリスクの代わりにプラス記号を代入するだけです。これは、介在文字なしで複数のパス区切り文字を無効にします。
regexのアプローチと詳細に関するより大きな問題については、コメントするのが役に立ちます。
1)(\ | /)ではなく[\ /]を使用できますが、両方ともオペレーティングシステムとファイルシステムのすべての組み合わせで誤検出を許可します。スラッシュを必要とするものは、セパレータとしてバックスラッシュを除外する必要があります。
2)文字範囲[a-zA-Z0-9 \ s -_ \ @ - \ ^!$ $ &]問題は、オペレーティングシステムとファイルシステムの既知の組み合わせのディレクトリパス要素の許容文字範囲ではありません。たとえば、ほとんどの期間、ディレクトリ名にピリオドが有効です。
3)使用できる文字の範囲は移植できません。パス検証をテストする最も信頼性の高い方法は、実際のファイルシステムのファイル名に触れることです。つまり、実際に空のファイルをインスタンス化し、インスタンス化の失敗の兆候をキャプチャすることを意味します)。アスタリスクの後、または2番目の(\ | /)グループの後に疑問符を付けます。彼らはバグを作成しませんが、コンパイルやランタイムのいずれかを浪費し、正規表現目的を難読化します。
5)拡張の直前に文字範囲を再入力するか、下の例のように並べ替える必要があります。
6)\ iを正規表現の末尾にあるフラグとして使用する場合、a-z範囲にA-Z範囲を追加する必要はありません。
7)望ましい結果のリストから、相対パスは除外されますが、ソリューションのルールとして明示的に言及されていません。
躊躇せずに、このコードは上記の改善のいくつかを示すために提供されています。
// This code is not production worthy
// for reasons (1) through (3) given
// above and is provided only for the
// purpose of clarifying points made.
var re = /^([\\/][a-z0-9\s\-_\@\-\^!#$%&]*)+(\.[a-z][a-z0-9]+)?$/i
console.log(
[
'/',
'/asdf',
'/asdf/scd.csv',
'//asdf',
'/asd/ads/c.csv/',
'asd/asfd/a'
].map(RegExp.prototype.test, re))