Modulelessen (3/4)
Niet-vastleggende groepen: `(?:...)`
Vaak zijn haakjes alleen nodig om te groeperen (kwantificeren, afwisselen)
en NIET om de waarde te extraheren. Gebruik in dat geval de non-capturing
versie: (?:...). Het werkt op dezelfde manier als (...) maar maakt geen creatie
een genummerde groep.
Pattern: (?:https?)://(\w+\.\w+)
Sample: https://example.com e http://test.org
Match e gruppi:
match = "https://example.com" gruppo1 = "example.com"
match = "http://test.org" gruppo1 = "test.org"(?:https?) groepeert het schema om de ? kwantor toe te passen, maar wij zijn
niet geïnteresseerd in het extraheren van https als groep: groep 1 is direct de
domein.
Waarom het gebruiken
- Leesbaarheid: de lezer begrijpt meteen dat de groep er alleen voor is structuur, niet om er een waarde uit te halen.
- Prestaties: de engine hoeft de wedstrijd van de groep niet op te slaan.
- Schone nummering: genummerde groepen blijven op één lijn "informatie die ik echt nodig heb", zonder tussenkomst.
Optimaliseren met niet-vastleggende groepen
Het gebruik van (?:...) vertelt de engine om groeperings- en kwantificatieregels toe te passen zonder geheugen te verspillen bij het opslaan van tussentijdse wedstrijdresultaten. Dit wordt ten zeerste aanbevolen bij zware lussen of bij zeer lange tekstverwerking.
Probeer het
Extraheer het domein (`example.com`, `test.org`...) uit elke URL in de tekst. Gebruik `(?:https?)` voor het protocol (u hoeft het niet vast te leggen) en een enkele groep voor het domein.
Toon hint
Wijzig de eerste groep van (https?) in (?:https?): u hoeft deze niet vast te leggen, u wilt alleen het domein.
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
Zoek elke herhaling van `ab` als een enkele match, maar ZONDER de groep vast te leggen (aangezien je alleen de hele match nodig hebt).
Toon hint
Dezelfde syntaxis als de vorige les, maar met (?:ab)+ in plaats van (ab)+.
Oplossing beschikbaar na 3 pogingen
Extra uitdaging
Find price digits followed optionally by decimal parts inside a non-capturing group, e.g. `100` or `100.50`.
Toon hint
Gebruik (?:\\.\\d{2})? om het decimale deel optioneel te maken zonder het vast te leggen.
Oplossing beschikbaar na 3 pogingen