Regex hoe een optioneel teken te matchen

Ik heb een regex waarvan ik dacht dat die tot nu toe correct werkte. Ik moet matchen op een optioneel karakter. Het kan er zijn of niet.

Hier zijn twee strings. De bovenste snaar komt overeen, terwijl de onderste dat niet is. De afwezigheid van een enkele letter in de onderste string zorgt ervoor dat het niet lukt.

Ik zou graag de enkele letter na de eerste 5 cijfers willen krijgen als deze er is en zo niet, ga dan door met het ophalen van de rest van de tekenreeks. Deze letter kan A-Zzijn.

Als ik ([A-Z]{1}) +.*? +van de regex, het komt overeen met alles wat ik nodig heb, behalve de letter, maar het is nogal belangrijk.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Hier is de regex die ik gebruik.

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

Antwoord 1, autoriteit 100%

Gebruik

[A-Z]?

om de letter optioneel te maken. {1}is overbodig. (Je zou natuurlijk ook [A-Z]{0,1}kunnen schrijven, wat hetzelfde zou betekenen, maar daar is de ?voor.)

Je zou je regex kunnen verbeteren om

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

En aangezien in de meeste regex-dialecten \dhetzelfde is als [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

Maar: heb je echt 11 aparte opnamegroepen nodig? En zo ja, waarom leg je dan niet de op drie na laatste groep cijfers vast?


Antwoord 2, autoriteit 11%

Je kunt de enkele letter optioneel maken door er een ?aan toe te voegen als:

([A-Z]{1}?)

De kwantor {1}is overbodig, dus u kunt deze weglaten.


Antwoord 3, autoriteit 3%

Je moet de enkele letter ook als optioneel markeren:

([A-Z]{1})? +.*? +

of maak het hele deel optioneel

(([A-Z]{1}) +.*? +)?

Antwoord 4

U kunt ook een eenvoudigere regex gebruiken die voor uw geval is ontworpen, zoals (.*)\/(([^\?\n\r])*)waarbij $2overeenkomen met wat je wilt.


Antwoord 5

hier is de regex voor het wachtwoord waarvoor minimaal 8 tekens nodig zijn, inclusief een cijfer, kleine letters en hoofdletters en optioneel een speciaal teken

/((?=.\d)(?=.[az])(?=.*[AZ])(?![~@#$%^&*_ -+=`|{}:;!.?”()[]]).{8,25})/

/((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?![~@#\$%\^&\*_\-\+=`|{}:;!\.\?\"()\[\]]).{8,25})/

Other episodes