如何在Erlang / Elixir中执行不区分大小写的文件搜索

时间:2017-08-09 17:23:12

标签: erlang elixir case-insensitive file-search

Elixir提供Path.wildcard,它在内部使用Erlang :filelib.wildcard函数。

  

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

是否有不区分大小写的替代方案?

1 个答案:

答案 0 :(得分:4)

没有内置选项可以执行此操作,但由于通配符语法支持与正则表达式类似的字符替换,因此您可以将每个字母替换为其大写和小写版本的替换,例如, 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