Qual é a definição de uma expressão regular?

10

Recentemente, comecei uma discussão amistosa com Ghoti sobre o que constitui uma expressão regular nos comentários para minha resposta para esta questão . Eu aleguei que o seguinte é uma expressão regular:

'[Rr]eading[Tt]est[Dd]ata'

Ghoti discordou, alegando que é um arquivo glob. A glob página na wikipedia afirma que (ênfase minha):

Globs do not include syntax for the Kleene star which allows multiple repetitions of the preceding part of the expression; thus they are not considered regular expressions, which can describe a larger set of regular languages over any given finite alphabet.

No entanto, não há nenhuma citação para essa afirmação, indicando que é apenas uma opinião do editor da wikipedia em particular.

A The Single UNIX ® Specification, Versão 2 , declara que um Basic Regular Expressão (BRE) pode até ser um único caractere:

An ordinary character is a BRE that matches itself: any character in the supported character set, except for the BRE special characters listed in BRE Special Characters .

Então, qual é a definição de uma expressão regular no mundo * nix, e essa definição exclui globs de arquivos?

    
por terdon 27.08.2012 / 15:47

2 respostas

10

Como disse lk, a opção -name de find tratará o argumento como glob, não uma expressão regular.

Se uma string é interpretada como glob ou regex ou apenas uma string simples depende do que está sendo usado para interpretar. É uma questão de contexto. A string em seu exemplo, [Rr]eading[Tt]est[Dd]ata pode ser avaliada de várias maneiras diferentes, mas o que é depende de como você a está usando. Use-o como um glob, é um glob. Use-o como um regex, é um regex. No caso da pergunta em que isso se originou , o OP descreveu a string como uma expressão regular. Portanto, podemos supor que ele estava planejando interpretá-lo como um regex.

Um único caractere também pode ser um regex, absolutamente. Também pode ser uma string, e também pode ser um glob. Poderia ser interpretado como um byte ou um tinyint, se você quiser. Tudo depende do contexto.

Existem várias especificações para expressões regulares em vários formulários. BRE e ERE estão bem documentados. O PCRE adiciona vários recursos de funcionalidade. Muitos intérpretes regex implementarão, por exemplo, "todos os ERE e alguns do PCRE". Ou eles farão ERE menos algum recurso. Se você seguir as especificações formais, muitas ferramentas afirmam que o suporte a regex está incorreto ou incompleto. Conhecer os detalhes permite adaptar suas soluções à coleção de funcionalidades disponíveis em qualquer ferramenta que esteja avaliando sua regex.

Então ... se você está procurando definições que "excluam" globs, você está olhando para isso do ponto de vista errado. O que é é determinado por como você o usa .

    
por 27.08.2012 / 17:35
7

[Rr]eading[Tt]est[Dd]ata parece ser válido como uma expressão global e regular, e acredito que tenha o mesmo "significado" em ambas as interpretações. No entanto, a opção -name de find tratará o argumento como glob, não uma expressão regular.

Essa distinção importará se você fornecer um argumento como foo* , que é tanto um glob válido quanto uma expressão regular válida, mas tem um significado diferente dependendo da interpretação:

Se for interpretado como um padrão global, isso corresponderá a foo , foobar , foo123 , etc.

Se interpretado como uma expressão regular, isso corresponderá a fo , foo , foooooo , etc.

    
por 27.08.2012 / 16:03