Da this article,Come funziona questa espressione regolare?
/^1?$|^(11+?)\1+$/
controlla se un numero (il suo valore in unario) è primo o meno.
Utilizzando questo, perl -l -e '(1 x $_) !~ /^1?$|^(11+?)\1+$/ && print while ++$_;'
restituisce un elenco di numeri primi.
Non ho abbastanza esperienza con Perl, ma quello che ho capito è che l'espressione regolare sarà true per un numero che non è primo. Quindi, se stampiamo tutti i numeri che non producono vero con questa espressione, abbiamo un elenco di numeri primi. Questo è ciò che la query Perl sta cercando di fare.
circa la parte regex,
^1?$
parte è per il conteggio 1 come Not Prime
^(11+?)\1+$
è per abbinare numeri non primi a partire dal 4.
Quello che non mi capire è perché è necessario il ?
nel regex necessario. Secondo me /^1$|^(11+)\1+$/
dovrebbe essere più che bene ed effettivamente
perl -l -e '(1 x $_) !~ /^1$|^(11+)\1+$/ && print while ++$_;'
mi dà la stessa serie di numeri primi.
C'è qualche difetto nella mia comprensione dell'espressione regolare? Perché sono necessari i ?
s?
Non è ?
supposto che corrisponda a zero o una occorrenza dell'espressione precedente?
@cjm: è un modo standard per rendere le espressioni non-golose? Dove tutto funziona diversamente da '+?' E '*?'. Ho pensato che "?" Significava lo zero o una volta. – Lazer
@Lazer: il punto interrogativo che segue un quantificatore (come '+' o '*') è completamente diverso da quello che segue un token. – Borealid
Un '?' Che segue un altro quantificatore rende tale quantificatore non-avido. Vedi http://perldoc.perl.org/perlre.html#Quantifiers – cjm