2017-03-24 4 views
2

ファイルとディレクトリパスの検証用にregExを作成しようとしています。 私はこれを実装しましたが、失敗した1つの条件、つまり複数のスラッシュを同時に許さないようにしました。 また、他の特殊文字が許可されないれるべきではないファイルとディレクトリの正規表現

var x = /^(\\|\/){1}([a-zA-Z0-9\s\-_\@\-\^!#$%&]*?(\\|\/)?)+(\.[a-z\/\/]+)?$/i 
  • 試験1 - > /(通過すべきである)
  • 試験2 - >/ASDF(通過すべきである)
  • 試験3 - >/ASDF/scd.csv(通過すべきである)
  • 試験4 - > // ASDF(現在渡し、失敗する)
  • 試験5 - > /asd/ads/c.csv/(通過すべきである)
  • 試験6 - > asd/asfd/a(失敗するはずです)

これを解決する方法を提案できますか?

答えて

1

パス//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))

0

それぞれの間に一致するように、少なくとも一つの文字を強制され、代わりに/^(\/|([\\/][\w\[email protected]^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/iを使用してみてくださいスラッシュ:

var regex = /^(\/|([\\/][\w\[email protected]^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/i 
 

 
console.log([ 
 
    '/', 
 
    '/asdf', 
 
    '/asdf/scd.csv', 
 
    '//asdf', 
 
    '/asd/ads/c.csv/', 
 
    'asd/asfd/a' 
 
].map(RegExp.prototype.test, regex))

0
((\/[\w\s\[email protected]^!#$%&-]+)+\/?)|\/[\w\.\[email protected]^!#$%&-]* 

これは、サンプル入力と一致するようにテストされました。
BUT on np ++ perl-regexフレーバー)、私はjavascriptの経験がないので。
ここでは風味のない散文でも同じです。 「(オプションのスラッシュに続いてスラッシュと文字の何倍、)
または
スラッシュとゼロ以上の文字」

注1:明示的に "。"を追加しました。許可された文字に。
注2:あなたの "\ /"は "明白なスラッシュで、バックスラッシュではない"という意味です。