O padrão KornShell estende os padrões "glob" do shell POSIX (ou seja *
, ?
, , etc.) com especificadores de repetição como *(...)
, +(...)
, bem como negação entre muitos recursos interessantes.
Em um projeto hobbista, pretendo implementar esses padrões para processamento de strings em vez de várias variantes de regex, como BRE, ERE, JavaScript RegExp. Um grande benefício que percebo é que será menos detalhado em strings C, pois os caracteres de barra invertida podem ser evitados ao escrever os padrões.
Minha compreensão limitada da ciência da computação sugere que os recursos suportados pelos padrões KornShell o qualificam como uma especificação de uma gramática regular.
Pergunta: Isso é tecnicamente correto? (Mesmo que não seja, ainda percebo essa sublinguagem como valiosa e desejável.)
Sim, está correto, isso pode se qualificar como expressão regular, assim como os padrões glob estendidos de zsh, que têm uma tradução mais direta do regexp estendido regular:
.
?
?
x*
x#
*(x)
x+
x##
+(x)
x{1,2}
x(#c1,2)
{1,2}(x)
[...]
[...]
[...]
(...)
(...)
@(...)
a|b
(a|b)
@(a|b)
^
(#s)
$
(#e)
x?
(|x)
?(x)
\1
²\1
O
printf
builtin do ksh93 pode até traduzir regexps de um dialeto para outro:A implementação ast-open de
grep
tem um-K
/--ksh-regexp
para corresponder usando padrões glob estendidos ksh93.Mas eu ainda evitaria chamá-lo de regexp , pois isso provavelmente só levaria a confusão.
¹ embora os padrões glob sejam frequentemente ancorados por padrão ou em algum contexto possam ser ancorados por meio de alguma sintaxe externa como a
${var/#pattern/replacement}
que é semelhante${var/pattern/replacement}
ao padrão ancorado no início.² não há referência anterior no ERE padrão, apenas no BRE padrão, embora alguns mecanismos ERE o suportem como uma extensão. Em qualquer caso, tanto zsh quanto ksh93 suportam a captura de partes de uma correspondência e recuperá-la posteriormente (
$MATCH
/$match[1]
habilitado com(#m)
/(#b)
em zsh ou\0
/${.sh.match[0]}
(correspondência completa comosed
's&
)\1
/${.sh.match[1]}
em ksh93, dependendo do contexto.