Elixir提供了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 源代码中运行此操作都会生成名称包含"reAdmE."的所有文件。
"**/*[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