Usando repetição explicitamente numerada em vez de pontos de interrogatório, estrela e mais

StackOverflow https://stackoverflow.com/questions/3032593

  •  27-09-2019
  •  | 
  •  

Pergunta

Eu já vi padrões regex que usam repetição explicitamente numerada 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 é mais idiomático? Mais legível? Simplesmente "melhor"?
Foi útil?

Solução

Que eu saiba, eles são idênticos. Acho que talvez haja alguns motores por aí que não suportam a sintaxe numerada, mas não tenho certeza de qual. Lembro -me vagamente de uma pergunta há alguns dias, onde a notação explícita não funcionaria no bloco de notas ++.

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

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

Costumo preferir isso, especialmente quando o padrão repetido é mais do que alguns caracteres. Se você precisar corresponder a 3 números, algumas pessoas gostam de escrever: \d\d\d Mas eu prefiro escrever \d{3} uma vez que enfatiza o número de repetições envolvidas. Além disso, no futuro, se esse número precisar mudar, eu só preciso mudar {3} para {n} e não pareça novamente a regex na minha cabeça ou se preocupe em estragar tudo; requer menos esforço mental.

Se esse critério não for atendido, prefiro a abreviação. O uso da notação "explícita" se aproxima rapidamente do padrão e dificulta a leitura. Eu trabalhei em um projeto em que alguns desenvolvedores não sabiam muito bem REGEX (não é exatamente o tópico favorito de todos) e eu vi muito {1} e {0,1} ocorrências. Algumas pessoas me pediram para revisar seu padrão e é aí que eu sugeriria mudar essas ocorrências para a notação e economizar espaço e, IMO, melhorar a legibilidade.

Outras dicas

Eu posso ver como, se você tem um regex que faz muita repetição limitada, você pode querer usar o {n,m} forma de forma consistente para a legibilidade da legibilidade. 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, também devemos sugerir que eles usem o ?, * ou + em vez de.

E claro, {1} é pura desordem. Algumas pessoas parecem ter uma noção vaga de que significa "um e apenas um"-afinal, deve significar algo, certo? Por que uma linguagem tão patologicamente concedida suportaria uma construção que ocupa três caracteres inteiros e não faz nada? Seu único uso legítimo que eu conheço é isolar uma referência de backs 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 Regex excepcional. No entanto, nem todos os motores regex suportam repetição numerada, ? ou +.

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

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

O problema que eu previa é 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 sintaxe incomum, surge a pergunta: "Por que eles não fizeram da maneira padrão? O que eles estavam pensando que estou perdendo?"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top