Archief - Jaartal uit string halen (andere notaties)

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

KingOfWoods

Legacy Member
Hallo all!

Ik heb een mdb file met 7000 datums in een bepaalde kolom invoerdatum. Deze staan soms als "2000", "01/02/2000", "03/05/00" en ook nog " 04/00"

Nu wil ik dus het jaartal eruit halen via een functie zodat ik deze waarde in mijn nieuwe databank kan stoppen. Moet dus steeds 2000 worden.

Hoe begin ik hieraan?

merci

bealzebub

Legacy Member
Regex patterns gebruiken.

Deze zou moeten werken:
Code:
(?:\d{2}/)?\d{2}/(\d{2,4})

De gecapturede groep zou je jaartal moeten zijn. Werkt voor al je voorbeelden.

Je zal dan nog moeten kijken of de gecapturede groep uit maar twee tekens bestaat en daar dan het nodige jaartal voorplakken uiteraard. Je zal zelf moeten beslissen welk jaar het pivotjaar zal zijn (als er geen enkele datum in de toekomst ligt zal dat waarschijnlijk 12 of 13 zijn): 01/12 = 2012, 01/14 = 1914.

KingOfWoods

Legacy Member
Merci, zal het eens proberen te doen werken. Regex is niet mijn strafste ding, maar wel zeer handig blijkbaar. Ook eens dieper op in gaan.

KingOfWoods

Legacy Member
Ik krijg een error: Unexpected token ?

Ben nu wat tutorials aan het volgen, maar snap er toch nog niet veel van. Weet iemand ergens goede website of tutorial die deze uitgebreid tonen?

bealzebub

Legacy Member
Waarschijnlijk heb je dan de slash-versie van regex gebruikt, dan moet je de slashes in de expression ook nog escapen uiteraard (aangezien de slashes aan t begin en aan t einde delimiters zijn).

In Ruby:
Code:
> regex = /(?:\d{2}\/)?\d{2}\/(\d{2,4})/
 => /(?:\d{2}\/)?\d{2}\/(\d{2,4})/ 
> regex.match("01/02/2000")
 => #<MatchData "01/02/2000" 1:"2000"> 
> regex.match("03/05/00")
 => #<MatchData "03/05/00" 1:"00"> 
> regex.match("04/00")
 => #<MatchData "04/00" 1:"00">

In Javascript (NodeJS):
Code:
> var regex = /(?:\d{2}\/)?\d{2}\/(\d{2,4})/
undefined
> regex.exec("01/02/2000")
[ '01/02/2000',
  '2000',
  index: 0,
  input: '01/02/2000' ]
> regex.exec("03/05/00")
[ '03/05/00',
  '00',
  index: 0,
  input: '03/05/00' ]
> regex.exec("04/00")
[ '04/00',
  '00',
  index: 0,
  input: '04/00' ]

Goeie resources om Regex te leren…

Regular-Expressions.info - Regex Tutorial, Examples and Reference - Regexp Patterns
Mastering Regular Expressions, 3rd Edition*-*O'Reilly Media
Regular Expressions Cookbook*-*O'Reilly Media

Voor de volledigheid nog eens de expression uit mekaar halen:

Code:
(?:\d{2}\/)?

De haakjes maken er een groep van, da's zowel nodig voor die "?:" aan t begin en da vraagteken op t einde.
\d is een cijfer (digit)
{2} twee van hetgeen ervoor staat, in dit geval dus twee cijfers
\/ is gewoon een slash, maar die escapen we omdat er een slash aan t begin en t einde van de expression staat
Dan advanced stuff:
Het vraagteken op het einde zegt: het is optioneel (om je 04/2000) te dekken. Dus die eerste groep mag, maar moet er nie staan
Het "?:" aan t begin zegt: ik maak met m'n haakjes een groep, en normaal gezien zou je die als groep in het resultaat opnemen, maar k wil nie da je dat doet.

Code:
\d{2}\/

Twee cijfers met een slash derachter (zelfde als vorige, maar dan simpeler: niet optioneel en hoeft ook geen groep te zijn.

Code:
(\d{2,4})

Een groep met cijfers (analoog aan eerste), die moet er staan. die "{2,4}" zegt: met twee OF vier cijfers.

Regex lijkt heel cryptisch, maar je moet het gewoon beetje bij beetje opbouwen. Is enorm krachtig als je niet-letterlijke data maar wel een patroon moet matchen of vervangen. Best ook zorgen dat je een editor hebt die syntax coloring kan doen, anders is het zeer moeilijk om alles uit mekaar te houden.

KingOfWoods

Legacy Member
Wauw! Als ik hier ne +10 rep kon geven zou ik het doen. Merci om hier even de tijd voor te nemen. Ga die documentatie eens lezen en er mij eens in verdiepen. Echt bedankt voor de hulp.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan