Skip to content

mattpjohnson/drb

Repository files navigation

banner image

CircleCI Build Status Codecov Coverage Status SonarQube Technical Debt NPM Version NPM Bundle Size (min) NPM Bundle Size (min + gzip) NPM Type Definitions code style: prettier

drb (Date Regex Builder) is a library to aide in generating regular expressions to match dates.

Table of Contents

Purpose

Regular expressions are difficult to get right and can get messy quickly. Consider creating a regular expression to match a day of the month. A naïve attempt might be to create a regex that matches two digits:

\d{2}

But there's a problem with this - 99 matches this regular expression and is not a valid day of the month. So we must refactor this to be a little more clever:

[0-3][0-9]

This is closer to what we want, but it still matches numbers from 32 to 39.

[0-2][0-9]|3[0-1]

We're almost there. Valid dates still match correctly, and 32+ numbers are not matching, which is what we want. However, 00 generates a false-positive match when using this regex. We can finally meet all of the requirements with the following regex:

0[1-9]|[1-2][0-9]|3[0-1]

Using drb, this regex is easy to generate:

const drbMoment = drb(momentFormatter)
const regex = drbMoment('DD')
console.log(regex) // (?:(?:0[1-9]|[12][0-9]|3[01]))

Installation

Install with npm:

$ npm install --save drb

Or optionally using yarn

$ yarn add drb

Usage

Import drb and a formatter (currently only Moment.js is supported) using one of these methods:

Node.js

const { drb } = require('drb')
const { momentFormatter } = require('drb/formatters/momentFormatter')

ES6/TypeScript

import { drb } from 'drb'
import { momentFormatter } from 'drb/formatters/momentFormatter'

Now combine drb with a formatter

const drbMoment = drb(momentFormatter)

Use drbMoment to create regexes using the syntax provided by Moment.js

const regex1 = drbMoment('DD')
console.log(regex1) // (?:(?:0[1-9]|[12][0-9]|3[01]))

const regex2 = drbMoment('MM-DD-YYYY hh:mm:ss')
console.log(regex2)
// (?:(?:0[1-9]|1[0-2]))(?:-)(?:(?:0[1-9]|[12][0-9]|3[01]))(?:-)(?:\d{4})(?: )(?:(?:0[1-9]|1[0-2]))(?::)(?:(?:0[0-9]|[1-5][0-9]))(?::)(?:(?:0[0-9]|[1-5][0-9]))

License

MIT