/ / Una regex che analizzerà 00.00 - regex

Una regex che analizzerà 00.00 - regex

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 № 1

Non 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:

  1. Il punto è un carattere speciale e funge da jolly; se vuoi un punto letterale, devi sfuggirlo (.).
  2. 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.
  3. 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:]].