Sto cercando di creare un'espressione regolare che accetterà i seguenti valori:
- (Vuoto)
- 0
- 00
- 00.0
- 00.00
Mi sono inventato ([0-9]){0,2}.([0-9]){0,2}
che per me dice "le cifre da 0 a 9occorrendo da 0 a 2 volte, seguito da un "." carattere (che dovrebbe essere opzionale), seguito dalle cifre da 0 a 9 che si verificano da 0 a 2 volte. Se sono state inserite solo 2 cifre, "." non è necessario. Cosa c'è di sbagliato in questa espressione regolare?
risposte:
15 per risposta № 1Non hai reso il punto opzionale:
[0-9]{0,2}(.[0-9]{1,2})?
3 per risposta № 2
Prima di tutto, {0-2}
dovrebbe essere {0,2}
come era in prima istanza.
In secondo luogo, è necessario raggruppare anche le sezioni di ripetizione.
In terzo luogo, è necessario rendere l'intera parte facoltativa. Perché se c'è un punto, ci deve essere qualcosa dopo di esso, dovresti anche cambiare la seconda cosa da ripetere {1,2}
.
([0-9]{0,2})(.([0-9]{1,2}))?
2 per risposta № 3
Ci sono alcuni problemi con la tua espressione regolare:
- Il punto è un carattere speciale e funge da jolly; se vuoi un punto letterale, devi sfuggirlo (
.
). - Anche se hai sostituito il punto per non essere uncarattere jolly, la tua espressione regolare corrisponderà a stringhe come "0". perché non hai detto al motore delle espressioni regolari di abbinare solo il punto se ci sono numeri che lo seguono.
- Perché la tua espressione non è ancorato, potrebbe corrispondere ad esempio stringhe che contengono lo schema all'interno di un'altra parola (ad esempio ab12 corrisponderebbe).
Un modello migliore sarebbe qualcosa di simile:
/b[0-9]{0,2}(?:.[0-9]{1,2})?b/
Nota che (?:...)
rende il gruppo non creare un backreference, che probabilmente non è necessario nel tuo caso.
1 per risposta № 4
Ecco un modo, illustrato in Perl, da abbinare solo le stringhe che hai elencato. La parte importante è il suo metodo per associare stringhe vuote: non rende facoltativo ogni elemento del modello, una strategia che ha l'effetto indesiderato di abbinare quasi tutte le stringhe.
use warnings;
use strict;
my @data = (
"",
"0",
"00",
"00.0",
"00.00",
"foo", # Should not match.
".0", # Should not match.
);
for (@data){
print $_, "n" if /^$|^[0-9]{1,2}(.[0-9]{1,2})?$/;
}
0 per risposta № 5
La maggior parte degli esempi di cui sopra non ancorano l'inizio ^
e fine $
dei dati.
Lo risolverei con uno dei seguenti:
^[[:digit:]]{0,2}([.][[:digit:]]{1,2})$
^d{0,2}([.]d{1,2})$
^[0-9]{0,2}([.][0-9]{1,2})$
Per la leggibilità, generalmente preferisco usare [.]
a .
e usando le classi POSIX come [[:digit:]]
.