Il n'existe pas d'option intégrée pour cela, mais comme la syntaxe générique prend en charge les alternances de caractères similaires à regex, vous pouvez remplacer chaque lettre par une alternance de ses versions majuscules et minuscules, par ex. f0o
->[fF]0[oO]
, puis passez à Path.wildcard/1
. Voici une implémentation simple qui fait cela pour les lettres 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
L'exécution de ce dans le code source OTP produit tous les fichiers avec leur nom contenant « Readme. » dans tout les cas.
"**/*[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"]
J'ai vérifié l'exactitude de la sortie avec 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
Je ne pense pas qu'il y ait une façon de le faire avec cette fonction. Si le répertoire racine n'est pas trop grand, vous pouvez récupérer la liste entière et filtrer en utilisant une regex insensible à la casse. – Dogbert
aurait été propre si nous pouvions utiliser les [options] pour spécifier: case_insensitive –
En fait, vous pouvez faire une simple transformation de chaîne, en remplaçant toutes les lettres avec sa version inférieure et majuscule entre crochets, par exemple. 'abc' ->' [aA] [bB] [cC] '. Je posterai une réponse dans quelques minutes. – Dogbert