JavaScript-reguliere expressie | constructie - mogelijke inconsistentie

Misschien begrijp ik iets niet, maar kan iemand me uitleggen waarom de volgende code zich gedraagt ​​zoals hij is:

/^[1-9]\d*(\.\d{2})?$/.test('0.50') === false;
/^\.\d+$/.test('0.50') === false;
/^([1-9]\d*(\.\d{2})?)|(\.\d+)$/.test('0.50') === true;//<-- WTF?

Wat is hier aan de hand? Zoals u kunt zien is de 3e uitdrukking samengesteld uit de eerste twee verbonden door de operator | . Aangezien elke test false , is false | niet false == false ? Of mis ik een basisconcept met reguliere expressies?

Ik heb dit in de browser geprobeerd, en met nodejs. Hetzelfde resultaat in beide gevallen.

2

3 antwoord

Dit komt door de voorrang van operators.

Uw uitdrukking is ^ [1-9] [0-9] * (\. \ D {2})? of \. \ D + $ .

Als u het volgende doet:

/^([1-9][0-9]*(\.\d{2})?)$|^(\.\d+)$/.test('0.50')

u krijgt false zoals u verwacht.

(Let op extra $ en ^ bij de grenzen).

Meer details: in je tweede deel van de laatste expressie heb je niet langer . nodig om het eerste personage te zijn.

2
toegevoegd
Ik wist niet dat ^ en $ hogere prioriteit hadden dan | . Bedankt dat u de uitleg eenvoudig en duidelijk maakt.
toegevoegd de auteur rossipedia, de bron
"Voorrang" van de operator heeft er niets mee te maken. De regex-engine verwerkt eenvoudig elk token één voor één van links naar rechts. De oorspronkelijke (foutief geschreven) uitdrukking heeft eenvoudigweg twee globale alternatieven met de ^ aan het begin van de eerste, en de $ aan het einde van de tweede. Een andere manier om dit te verhelpen is om alles tussen de twee ankers te groeperen, d.w.z. /^ (?: exp1 | exp2) $/ Anders is dit antwoord correct. 1
toegevoegd de auteur ridgerunner, de bron

Ja, maar dat is niet fout | vals. Ik zal wat meer haakjes toevoegen om duidelijk te maken wat de derde regex evalueert als:

/(^([1-9]\d*(\.\d{2})?))|((\.\d+)$)/.test('0.50') === true;//<-- WTF?
0
toegevoegd

When you use alternation like this, you must also enclose the different groups in ()

/^(?:([1-9][0-9]*(\.\d{2})?)|(\.\d+))$/

Anders gedraagt ​​uw regex zich heel anders.

0
toegevoegd