Graag hulp bij regex numerieke waarde

Status
Niet open voor verdere reacties.

bron

Moderator
Forumleiding
Moderator
Lid geworden
13 aug 2013
Berichten
5.374
Beste helpers,

Mijn kennis is niet toereikend voor een efficiente regex.
Wie kan mij helpen met een zo kort mogelijke regex die voldoet aan:
- alleen hele numerieke waardes
- toegestaan is 0 of een waarde +10 tot +999
- voor en/of na de numerieke waarde mogen spaties staan

Maar dit dus niet:
Negatieve waardes of numeric 1-9 (ook geen 01, 02, 03, enz.)

Ik heb nu voor de range 10-999: /[1-9][0-9]{1,2}/i

Alvast bedankt voor de hulp.
 
Je zou een "of" statement kunnen gebruiken voor de "0" en dan ben je er volgens mij wel redelijk. Overigens voor mijn eigen nieuwsgierigheid, waarom wil je 0xx uitsluiten? of is het heel specifiek iets waarvoor je de uitkomst wil gebruiken

zoiets:

\b([1-9][0-9]{1,2}\b)|\b0\b
 
Laatst bewerkt:
Hoi wampier.

Bedankt voor je aanvulling. ik heb nu: /[1-9][0-9]{1,2}|0/i
Nu heb ik een validatie voor 0 en 10-99. Dat gaat goed.

Het is voor een bestelformulier van een cms waarin per invulveld een perl-achtige regex opgegeven kan worden (voor validatie). Bij bepaalde producten is het minimum bestel aantal 10 stuks, vandaar mijn vraag.

De php van deze module zorgt er helaas voor dat mensen het minimum kunnen omzeilen door bijvoorbeeld 04 te typen. Dit wordt dan als OK gevalideerd. Vanwege updates in de toekomst wil ik de core php van de module niet wijzigen. Ik mis dus het stukje regex dat 04 als Not OK valideert....

Heb je nog een idee hiervoor?
 
Laatst bewerkt:
Daar zijn de \b voor in mijn vorige post. dat betekend dat de 0 vrij moet staan of de enige input is. hetzelfde geld voor de \b rond de eerste.

345678

is namelijk 2x een valide input en zal niet een error genereren met de \b eromheen moet de input ophouden om valide te zijn. Als het puur voor getallen invoer is kun je ook effectief gebruik maken van ^ en $

^[1-9][0-9]{1,2}$|^0$

nu kan er echt niets anders staan, dus geen letters, etc ervoor. de \b oplossing werkt ook met cijfers in het midden van een zin etc en is dus wat algemener
 
Super!! Het werkt bijna helemaal volgens mijn wens.

\b([1-9][0-9]{1,2}\b)|\b0\b
Voordeel: werkt met spaties (voor/na getal)
Nadeel: negatieve getallen en decimalen worden als ok gevalideerd.

^[1-9][0-9]{1,2}$|^0$
Voor- en nadeel precies andersom dan hierboven.
Deze gebruik ik nu. Dan mag ik geen spaties voor/na het getal zetten.
Maar dit is de beste optie van beide.

Als je misschien nog een oplossing weet voor de spaties, dan heel graag :)
 
Laatst bewerkt:
je kunt een blok spaties toestaan:

^[ ]+?[1-9][0-9]{1,2}[ ]+?$|^0$

kan het even niet meer verder testen maar zoiets zou kunnen werken. Het is vreemd dat negatieve waarden wel gevalideerd worden, bij mijn regex opdracht wordt die correct geweerd. Echter niet alle engines zijn hetzelfde
 
Ook nu weer bedankt voor je hulp.
Ik ben van jouw filter uitgegaan en heb veel gelezen over wat elk dingetje doet.
Na een hoop experimenteren heb ik nu het volgende

(^[ ]*[0]*[1-9][0-9]{1,2}[ ]*$)|(^[ ]*0*[ ]*$)

. Elke waarde moet 0 zijn of in de range 10-999 liggen.
. Een waarde mag voorloop '0' hebben en daarvoor mogen spaties staan.
. Achter de waarde mogen spaties staan.
. Decimalen zijn niet toegestaan.
. Negatieve waardes zijn niet toegestaan.

Hiermee is het zo vriendelijk mogelijk geworden voor iemand die het formulier invult.
Nu kijken of het korter kan :) Heb jij een suggestie?
 
Laatst bewerkt:
Performance van een regex heeft weinig te maken met de lengte. gewoon lekker laten zo.
 
Helemaal mee eens. Het gaat mij meer om efficientie en leesbaarheid.
De OR zou er misschien uitgehaald kunnen worden denk ik met iets als
Code:
| 0 of meer | 0 of meer |   0 of 1 keer   | 0 of meer |
|  spaties  |   nullen  |  range 10-999   |  spaties  |
|    [ ]*   |    [0]*   | [1-9][0-9]{1,2} |    [ ]*   |
Dit zou toch te doen kunnen zijn met een regex, of is dat lastig?

*** Aanvulling.
Het is opgelost. Nadat ik het filter hierboven in leesbaar NL had ingetypt, ben ik het gaan omzetten en het werkt in 1 keer :)
^[ ]*[0]*([1-9][0-9]{1,2})?[ ]*$

Wamper: zeer bedankt voor je gewaardeerde hulp. Ik heb er een hoop van geleerd.
 
Laatst bewerkt:
Die "0 of 1 keer" kan wel maar daar wordt de leesbaarheid wat mij betreft niet beter op . Je ziet nu duidelijk wat de bedoeling is en dat er twee bereiken zijn.

Door een lazy lookbehind of een positieve lookahead kun je in principe dit bereiken, maar die maken een regex voor de meeste mensen echt niet leesbaarder:

http://www.rexegg.com/regex-lookarounds.html
 
Yep, is inderdaad zo. Het is de voorkeur die je hebt en in dit geval zijn beide leesbaar.
Maar soms zie ik in prog.talen dingen die ik tig keer moet bekijken, bijv.
not (not Var1 and Var2)
geef mij dan maar
Var1 or (not Var2)
Het doet hetzelfde, maar de laatste vind ik prettiger.
Vandaar dat ik altijd bij booleans nog een extra keer naar efficientie en leesbaarheid kijk.
 
Laatst bewerkt:
Let wel op dat met je huidige oplossing "geen invulling" ook legaal is dus een leeg invoervak
 
Thanx voor je aanvulling waar ik rekening mee moet houden.

De besteller mag een veld idd leeglaten, of alleen spaties invullen. Dit alles om het zo vriendelijk mogelijk voor hem te maken. Eigenlijk mag de besteller alles invullen zolang ik hieruit met php een valide integer kan halen.
Lege waarde of alleen spaties betekent dus: aantal = 0

Ik zal mij nog wel even bezig moeten houden met een stukje php om alles wat mogelijk is om te zetten naar een geldige integer.

Bedankt voor je tips en dingen waar ik op moet letten.
De status heb ik op opgelost gezet.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan