2017-08-09 101 views
2

药剂执行不区分大小写的文件搜索提供Path.wildcard,其内部使用的Erlang :filelib.wildcard功能。如何二郎/药剂

匹配区分大小写,例如“a”与“A”不匹配。 (http://erlang.org/doc/man/filelib.html#wildcard-1

请有没有不区分大小写替代?

+1

我不认为有任何办法做到这一点与该功能。如果根目录不是太大,则可以使用不区分大小写的正则表达式来获取整个列表并进行过滤。 – Dogbert

+0

本来整齐的,如果我们可以使用[选项]指定:CASE_INSENSITIVE –

+0

其实你可以做一个简单的字符串变换,既有它的下限和大写在方括号,例如版本替换所有字母'abc' - >'[aA] [bB] [cC]'。我会在几分钟后发布答案。 – Dogbert

回答

3

有没有内置的选项要做到这一点,但由于通配符语法支持类似的正则表达式字符交替,你可以用它的小写和大写形式,例如的交替更换每一个字母f0o - >[fF]0[oO],然后传递到Path.wildcard/1。这里有一个简单的实现,这是否为ASCII字母:

defmodule A do 
    def case_insensitive_glob(glob) do 
    Regex.replace(~r/[a-zA-Z]/, glob, fn letter -> 
     "[#{String.downcase(letter)}#{String.upcase(letter)}]" 
    end) 
    end 
end 

glob = A.case_insensitive_glob("**/*reAdmE.*") |> IO.inspect 
Path.wildcard(glob) |> IO.inspect 

在OTP源代码,运行此产生含其名称的所有文件“自述”。任何状况之下。

"**/*[rR][eE][aA][dD][mM][eE].*" 
["README.md", "erts/emulator/pcre/README.pcre_update.md", 
"lib/erl_interface/src/README.internal", 
"lib/ic/examples/pre_post_condition/ReadMe.txt", "xcomp/README.md"] 

我已验证输出的正确性与find

$ find . -iname 'readme.*' 
./erts/emulator/pcre/README.pcre_update.md 
./lib/erl_interface/src/README.internal 
./lib/ic/examples/pre_post_condition/ReadMe.txt 
./README.md 
./xcomp/README.md 
+0

这是一个很酷的把戏! –

+0

我相信我们能逃脱这种不区分大小写功能的完整路径,并将其应用到药剂的Path.wildcard,如果:选择CASE_INSENSITIVE选项。 这会很贵吗? –

+3

如果Elixir添加了这个功能,他们可能也想要支持Unicode字母,并且还可以使用递归+模式匹配来替换性能的手动替换替换'Regex.replace'。 – Dogbert