Your scenario is a classic use case for Batch Apex. What you will need here is to write a batch class, which will look for all such Contacts those need to be deleted, and then schedule this batch daily to be able to process contact deletion based on the criteria.
As for how to write batch apex and scheduling them, there are lots of resources available on documentation and trailhead. Following links are a good place which will provide you a pointer to understand the topics around batch apex, and scheduling the batches.
In your scenario, you will need to perform the following in your batch class:
- In start() method - You will need to perform a SOQL to retrieve all such Contacts which have their expiry date as of today
- In execute() method - You will delete all such Contacts which were retrieved based on your criteria
- In finish() method - You may like to perform any post deletion tasks if at all.
Once you have your batch class written, write a Scheduler and schedule it (hourly, daily, etc.) based on your requirements. Refer the link above on scheduler for more details.