2016-06-16 18 views
3

私はminimatchを使用し、私が欲しいファイルを除外するのに問題がある何かのためにグロブを書こうとしています。ここではテストケースです:私のグロブには何が問題なのですか?

const glob = 'src/js/*!(test|stub).js' // this is the glob I'm trying to work out 

const shouldMatch = [ 
    'src/js/foo.js', 
    'src/js/bar.js', 
    'src/js/baz.js', 
] 

const shouldNotMatch = [ 
    'src/js/foo.test.js', 
    'src/js/bar.stub.js', 
    'src/baz/blob.js', 
] 

const all = shouldMatch.concat(shouldNotMatch) 

const matched = minimatch.match(all, glob) // https://www.npmjs.com/package/minimatch 

expect(matched).toEqual(shouldMatch) // https://npmjs.com/package/expect 

これで出力は次のようになります。

"Error: Expected [ 'src/js/foo.js', 'src/js/bar.js', 'src/js/baz.js', 'src/js/foo.test.js', 'src/js/bar.stub.js' ] to equal [ 'src/js/foo.js', 'src/js/bar.js', 'src/js/baz.js' ] 

あなたはこのhereのライブバージョンを見ることができます。

ご覧のとおり、ファイルにはtestとがあります。 これらのファイルが除外されるためには、globが必要なものは何ですか?

+0

は、あなたのグロブは通常の文字列ではありません式 –

+0

const glob = 'src/js/*(foo | bar | baz).js' は、この正規表現を試してみても問題ありませんか?それは非常に長いことができるという事実から離れて! –

+0

これは、より簡単なコア問題を解決するための孤立した例です。実際には、私はもっと多くのファイルを持っています(さらに時間外を追加します)。私は実際にこれをコード化して動作させる必要があります。また、私はglobを第三者に渡しているので、正規表現を使うことはできません。真のグロブでなければなりません。 – kentcdodds

答えて

7

これは、!(...)構文のよくある間違いです。

ls *!(.png|.jpg)

これは.png.jpg*で一致しているので、私たちがやりたいことはありません。このようなものを想像してみてください。したがって、!(.png|.jpg)に達すると、文字列はnullになります。

それを修正するために、我々は行うことができます。

ls !(*.png|*.jpg)

をこのように、あなたの例を修正する:

const glob = 'src/js/!(*test|*stub).js'

ここだa working example

+1

すばらしい。ありがとう、クリス! – kentcdodds

関連する問題