it-swarm.dev

come abbinare un numero che è inferiore o uguale a 100?

Voglio abbinare un numero che è minore o uguale a 100, può essere qualsiasi cosa compreso tra 0-100, ma la regex non deve corrispondere per un numero che è maggiore di 100 come 120, 130, 150, 999, ecc.

20
chanti

Prova questo

\b(0*(?:[1-9][0-9]?|100))\b

Spiegazione

"
\b                # Assert position at a Word boundary
(                 # Match the regular expression below and capture its match into backreference number 1
   0              # Match the character “0” literally
      *           # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   (?:            # Match the regular expression below
                  # Match either the regular expression below (attempting the next alternative only if this one fails)
         [1-9]    # Match a single character in the range between “1” and “9”
         [0-9]    # Match a single character in the range between “0” and “9”
            ?     # Between zero and one times, as many times as possible, giving back as needed (greedy)
      |           # Or match regular expression number 2 below (the entire group fails if this one fails to match)
         100      # Match the characters “100” literally
   )
)
\b                # Assert position at a Word boundary
"

Visita (collegamento rimosso) per problemi futuri.

40
Cylian

Che ne dici di questo per la regex:

^([0-9]|[1-9][0-9]|100)$

questo dovrebbe validare 7, 82, 100 per gli esempi, ma sarebbe not validare 07 o 082.

Controlla questo per ulteriori informazioni (e variazioni tra cui il prefisso zero) sul controllo dell'intervallo numerico


Se devi soddisfare i numeri in virgola mobile dovresti leggere questo , ecco un'espressione che puoi usare:

Punto mobile: ^[-+]?([0-9]|[1-9][0-9]|100)*\.?[0-9]+$

6
musefan

Usa Code Assertions se hai bisogno di una regex (eventualmente):

 /^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/

Test: 

my @nums = (-1, 0, 10, 22, 1e10, 1e-10, 99, 101, 1.001e2);

print join ',', grep 
                /^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/,
                @nums

Risultato:

 0,10,22,1e-010,99

(==> Ecco qua sth per conoscere le asserzioni di codice ).

4
rubber boots

Il mio consiglio pratico.  

Personalmente, mi astenerei dal scrivere del tutto una regex così complessa. Cosa succede se il tuo numero cambia da 100 a 200 nel prossimo futuro. Il tuo regex dovrà cambiare in modo significativo e potrebbe essere ancora più difficile da scrivere. Tutte le soluzioni di cui sopra NON sono auto esplicative e dovrai integrarla con un commento nel tuo codice. È un odore. 

La leggibilità conta. Il codice è per gli umani e non per le macchine.

Perché non scrivere un codice attorno ad esso e mantenere l'espressione regolare semplice da capire. 

2
Mayank Jaiswal

questo corrisponde a 0 a 100

^0*([0-9]|[1-8][0-9]|9[0-9]|100)$
1
Ahmad Alaa

Questo regEx corrisponde ai numeri 0-100 diapason e non consente numeri come 001:

\b(0|[1-9][0-9]?|100)\b
0

regex per questo

Perl -le 'for (qw/0 1 19 32.4 100 77 138 342.1/) { print "$_ is ", /^(?:100|\d\d?)$/ ? "valid input" : "invalid input"}'
0