Usando ripetizione esplicitamente numerati al posto del punto interrogativo, stella e oltre

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

  •  27-09-2019
  •  | 
  •  

Domanda

ho visto i modelli regex che utilizzano esplicitamente numerati ripetizione invece di ?, * e +, cioè:.

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

Le domande sono:

  • Sono queste due forme identiche? Che cosa succede se si aggiunge possessivi modificatori / riluttanti?
  • Se sono identici, che uno è più idiomatica? Più leggibile? Semplicemente "migliore"?
È stato utile?

Soluzione

Per quanto ne so sono identici. ci penso che forse un paio di motori là fuori che non supportano la sintassi numerata, ma non sono sicuro che. Ricordo vagamente una domanda su SO qualche giorno fa in cui la notazione esplicita non avrebbe funzionato in Notepad ++.

L'unica volta che avrei usato esplicitamente numerati ripetizione è quando la ripetizione è maggiore di 1:

  • Esattamente due: {2}
  • Due o più: {2,}
  • due a quattro: {2,4}

I tendono a preferire questi soprattutto quando il modello ripetuto è più di un paio di caratteri. Se si devono indovinare 3 numeri, alcune persone piace scrivere: \d\d\d ma vorrei piuttosto \d{3} scrittura perchè sottolinea il numero di ripetizioni coinvolti. Inoltre, lungo la strada, se quel numero mai ha bisogno di cambiare, ho solo bisogno di cambiamento {3} a {n} e non ri-analizzare l'espressione regolare nella mia testa o preoccuparsi di scompigliare in su; richiede meno sforzo mentale.

Se che i criteri non è soddisfatto, io preferisco la stenografia. Utilizzando la notazione "esplicito" rapidamente ingombra il modello e lo rende difficile da leggere. Ho lavorato su un progetto in cui alcuni sviluppatori non sapevano regex troppo bene (non è esattamente argomento preferito di tutti) e ho visto un sacco di {1} e {0,1} occorrenze. Alcune persone mi chiedeva di revisione del codice loro modello e che quando vorrei suggerire cambiando quegli eventi per notazione abbreviata e risparmiare spazio e, IMO, migliorare la leggibilità.

Altri suggerimenti

posso vedere come, se si dispone di una regex che fa un sacco di ripetizioni limitato, si potrebbe desiderare di utilizzare il modulo {n,m} costantemente per il bene di leggibilità. Ad esempio:

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

Ma non riesco a ricordare di aver mai visto un caso del genere nella vita reale. Quando vedo {0,1}, {0,} o {1,} utilizzate in una domanda, è praticamente sempre stato fatto per ignoranza. E nel processo di rispondere a questa domanda, dobbiamo anche suggerire che usano il ?, * o + posto.

E, naturalmente, {1} è puro disordine. Alcune persone sembrano avere una vaga idea che significa "una e una sola" - dopo tutto, si deve dire qualcosa , giusto? Perché un linguaggio come patologicamente stringato sostenere un costrutto che occupa un intero tre caratteri e non fa nulla a tutti? Il suo uso solo legittimo che io conosco è quello di isolare una backreference che è seguita da una cifra letterale (ad esempio \1{1}0), ma ci sono altri modi per farlo.

  • Sono tutti uguali a meno che non si sta utilizzando un motore di espressioni regolari eccezionale. Tuttavia, non tutti i motori di regex supportano numerati ripetizione, ? o +.

  • Se tutti sono disponibili, userei i personaggi piuttosto che i numeri, semplicemente perché è più intuitivo per me.

Sono equivalenti (e scoprirete se sono disponibili mediante un esame del contesto.)

Il problema che avevo anticipare è quando potrebbe non essere l'unica persona mai bisogno di lavorare con il codice. Espressioni regolari sono abbastanza difficile per la maggior parte delle persone. Ogni volta che qualcuno usa una sintassi inusuale, la questione si pone: "Perché non l'hanno fatto il modo standard cosa stavano pensando che mi manca"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top