Write regular expressions clearly with comments and named matches.
The most convenient way to use clear-regex is with tagged template literals. This way it's easy to
- split regular expression accross lines
- add comments
- use other regexes or values inside the new regex
const crx = require('clear-regex');
const yearRx = /\d{4}/;
const monthRx = /\d{2}/;
const dayRx = /\d{2}/;
const myNewRegex = crx`
# this matches date strings like '2019-01-13'
${yearRx}- # this is the year part
${monthRx}- # month part
${dayRx} # day part
`;
The comments, whitespace and newline characters get stripped away and the result of the above is the same as
const myNewRegex = /\d{4}-\d{2}-\d{2}/;
The comments begin with a #
character and go until the end of the line. Use them to explain what a certain part of your regular expression does.
const phoneNumber = crx`
# matches phone numbers
#
# there can be any number of digits
# optionally grouped with spaces or dashes
#
^\s* # optional whitespace at the beginning
(\+|0+) # start with a plus or zeros
( # begin group od digits
([- ])? # optional delimiter
(\d+) # some digits
)+ # end group of digits
\s*$ # optional whitespace at the end
`;
If you use clear-regex as a tagged template literal, you can use placeholders to insert literal values or other regular expressions into your new regex. This makes dynamic regexes and reuse convenient.
const year = 2019;
const monthRx = /\d{2}/;
const dayRx = /\d{2}/;
// match a date date string in 2019
const dateRx = crx`^${year}-${monthRx}-${dayRx}`;
You can use give names to your matching groups. This will make it easier to retrieve them from a matching result. The name tags look like ?<name>
.
const regex = crx`^
(?<year>\\d{4})-
(?<month>\\d{2})-
(?<day>\\d{2})
$`;
'2019-01-13'.match(regex);
// the result contains the groups prop with
// the named matches
//
// {
// ...
// groups: {
// day: '13',
// month: '01',
// year: '2019'
// }
// };
To use flags with the tagged template literals, start and end your reges with slashes, as you normally would, and put the flags after the closing slash.
const regex = crx`/
ice
(cream|coffee)
/gi`;
// this is the same as
const sameRegex = /ice(cream|coffee)/gi;