Usando repetições numeradas explicitamente em vez de ponto de interrogação, estrela e mais

Eu vi padrões de regex que usam repetições numeradas explicitamente em vez de ? , * e + , ou seja:

 Explicit Shorthand (something){0,1} (something)? (something){1} (something) (something){0,} (something)* (something){1,} (something)+ 

As perguntas são:

  • Essas duas formas são idênticas? E se você adicionar modificadores possessivos / relutantes?
  • Se eles são idênticos, qual deles é mais idiomático? Mais legível? Simplesmente “melhor”?

   

    Pelo que sei, são idênticos. Acho que talvez haja alguns mecanismos por aí que não suportam a syntax numerada, mas não tenho certeza de qual. Eu me lembro vagamente de uma pergunta sobre o SO há alguns dias, em que a notação explícita não funciona no Notepad ++.

    A única vez que usaria a repetição explicitamente numerada é quando a repetição é maior que 1:

    • Exatamente dois: {2}
    • Dois ou mais: {2,}
    • Dois para quatro: {2,4}

    Eu tendem a preferir estes, especialmente quando o padrão repetido é mais do que alguns caracteres. Se você tiver que combinar 3 números, algumas pessoas gostam de escrever: \d\d\d mas eu prefiro escrever \d{3} já que enfatiza o número de repetições envolvidas. Além disso, se esse número precisar mudar, eu só preciso mudar {3} para {n} e não re-analisar o regex em minha mente ou me preocupar em estragar tudo; requer menos esforço mental.

    Se esse critério não for atendido, prefiro a taquigrafia. Usar a notação “explícita” rapidamente sobrecarrega o padrão e dificulta a leitura. Eu trabalhei em um projeto onde alguns desenvolvedores não conheciam o regex muito bem (não é exatamente o tópico favorito de todos) e eu vi um monte de {1} e {0,1} ocorrências. Algumas pessoas me pediam para codificar rever seu padrão e isso é quando eu sugiro alterar essas ocorrências para notação abreviada e economizar espaço e, IMO, melhorar a legibilidade.

    Eu posso ver como, se você tem um regex que faz muita repetição limitada, você pode querer usar o formulário {n,m} consistentemente para facilitar a leitura. Por exemplo:

     /^ abc{2,5} xyz{0,1} foo{3,12} bar{1,} $/x 

    Mas não me lembro de ter visto esse caso na vida real. Quando eu vejo {0,1} , {0,} ou {1,} sendo usado em uma pergunta, está praticamente sempre sendo feito por ignorância. E no processo de responder a essa pergunta, devemos também sugerir que eles usem o ? , ou + vez disso.

    E, claro, {1} é pura desordem. Algumas pessoas parecem ter uma noção vaga de que significa “um e só um” – afinal, deve significar alguma coisa , certo? Por que uma linguagem tão patologicamente concisa suportaria um constructo que ocupa três caracteres inteiros e não faz absolutamente nada? Seu único uso legítimo que eu conheço é isolar uma backreference que é seguida por um dígito literal (por exemplo, \1{1}0 ), mas existem outras maneiras de fazer isso.

    • Eles são todos idênticos, a menos que você esteja usando um mecanismo de regex excepcional. No entanto, nem todos os mecanismos de regex suportam repetição numerada ? ou + .

    • Se todos eles estiverem disponíveis, eu usaria caracteres em vez de números, simplesmente porque é mais intuitivo para mim.

    Eles são equivalentes (e você descobrirá se eles estão disponíveis testando seu contexto).

    O problema que eu antecipo é quando você pode não ser a única pessoa que precisa trabalhar com seu código. Regexes são difíceis o suficiente para a maioria das pessoas. Sempre que alguém usa uma syntax incomum, surge a pergunta: “Por que eles não fizeram isso da maneira padrão? O que eles estavam pensando que eu estava perdendo?”