Costumo confundir globs de shell do Bash 3.x:
? # Match any single character.
* # Match any string of characters (up until the asterisk).
[set] # Match any character in set (but not the entire set itself).
[!set] # Match any character not in set.
com regex (especialmente PCRE ).
Minha pergunta é por que não vê-los como "Bash regex" (assim como temos "JavaScript regex" por exemplo)?
Por que não vê-los apenas como outro "dialeto" do regex?
Claro que seria pouco ortodoxo, mas não tenho certeza de que não haja nenhuma razão lógica formal para não fazê-lo.
Padrões de globbing de nomes de arquivo e expressões regulares têm uma sobreposição de sintaxe, até certo ponto, mas funcionam de maneiras fundamentalmente diferentes.
A expressão regular
e
corresponderá (dentro) à stringhello
, enquanto o padrão de globbing do nome do arquivoe
não. Padrões globbing são ancorados implicitamente, então o padrão globe
seria equivalente a uma expressão regular parecida com^e$
, mas sua aplicação pode ser diferente (a expressão regular corresponderia a uma linha completa em um texto, enquanto o padrão glob normalmente corresponderia a um único nome de arquivo).Os padrões de globbing de nome de arquivo também não possuem nenhum caractere especial que qualifique a expressão anterior, como
*
ou?
em uma expressão regular, ou qualquer facilidade para agrupar partes de expressões como(...)
em uma expressão regular ou para alternar entre possíveis subpadrões como|
faz em uma expressão regular. Alguns shells obviamente adicionam um pouco disso, comobash
oshopt -s extglob
habilitado, por exemplo.Os padrões globbing têm uso diferente das expressões regulares. As expressões regulares são usadas principalmente para selecionar/combinar strings de textos, enquanto os padrões de globbing de nome de arquivo são usados principalmente (mas não exclusivamente) para combinar nomes de arquivos ou gerar listas de nomes existentes de um diretório. Padrões de globbing são usados para corresponder strings , por exemplo
case ... esac
, mas um shell POSIX nunca usa expressões regulares para gerar listas de nomes de um diretório, a menos que seja estendido com esse recurso.Ambos os tipos de padrões são definidos pelo padrão POSIX:
Dos padrões globbing, o padrão começa dizendo
Existem vários "dialetos" de expressões regulares, como PCRE que você mencionou, mas os padrões de globbing de nome de arquivo não podem realmente ser considerados um deles.
Existem várias linguagens de padrão que são semelhantes aos padrões de globbing de nome de arquivo do shell, como os padrões usados em consultas SQL com
LIKE
. Todos eles são bastante simples e geralmente fornecidos como uma maneira conveniente de combinar bits de strings. As expressões regulares são, em comparação, muito mais complexas.Você mencionou "
bash
expressões regulares". Obash
shell suporta expressões regulares, mas não para correspondência de nome de arquivo. Dentro[[ ... ]]
de , o=~
operador executa uma correspondência de expressão regular da string do lado esquerdo com a expressão regular do lado direito. O tipo de expressões regulares que obash
shell suporta dessa maneira é o conjunto estendido padrão de expressões regulares. Consulte obash
manual do seu sistema para obter mais informações sobre isso.Globs e expressões regulares são duas linguagens de padrão distintas. O fato de haver alguma sobreposição na semântica de certos padrões não significa que um seja necessariamente um "dialeto" do outro. Todos que já usaram ambos reconhecem a semelhança, mas manter os nomes distintos reduz a possibilidade de confusão.
Em uma nota relacionada, acho lamentável que tantos tipos de expressões regulares (pelo menos básicas, estendidas e Perl com variações) tenham nomes muito semelhantes. A maioria das pessoas em minha experiência não qualifica a quem elas se referem, às vezes causando confusão desnecessária. Se esses sabores tivessem nomes muito mais distintos, poderia ter sido mais fácil falar sobre eles sem mal-entendidos.