Usando repetição explicitamente numerada em vez de pontos de interrogatório, estrela e mais
-
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"?
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?"