药剂执行不区分大小写的文件搜索提供Path.wildcard
,其内部使用的Erlang :filelib.wildcard
功能。如何二郎/药剂
匹配区分大小写,例如“a”与“A”不匹配。 (http://erlang.org/doc/man/filelib.html#wildcard-1)
请有没有不区分大小写替代?
药剂执行不区分大小写的文件搜索提供Path.wildcard
,其内部使用的Erlang :filelib.wildcard
功能。如何二郎/药剂
匹配区分大小写,例如“a”与“A”不匹配。 (http://erlang.org/doc/man/filelib.html#wildcard-1)
请有没有不区分大小写替代?
有没有内置的选项要做到这一点,但由于通配符语法支持类似的正则表达式字符交替,你可以用它的小写和大写形式,例如的交替更换每一个字母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
这是一个很酷的把戏! –
我相信我们能逃脱这种不区分大小写功能的完整路径,并将其应用到药剂的Path.wildcard,如果:选择CASE_INSENSITIVE选项。 这会很贵吗? –
如果Elixir添加了这个功能,他们可能也想要支持Unicode字母,并且还可以使用递归+模式匹配来替换性能的手动替换替换'Regex.replace'。 – Dogbert
我不认为有任何办法做到这一点与该功能。如果根目录不是太大,则可以使用不区分大小写的正则表达式来获取整个列表并进行过滤。 – Dogbert
本来整齐的,如果我们可以使用[选项]指定:CASE_INSENSITIVE –
其实你可以做一个简单的字符串变换,既有它的下限和大写在方括号,例如版本替换所有字母'abc' - >'[aA] [bB] [cC]'。我会在几分钟后发布答案。 – Dogbert