rexrex
🦖 Regular Expression utils that rock!
Create regular expressions that are composable, reusable, and commentable.
Getting started
yarn add rexrex
Utils
whole
whole('sentence to match') // -> ^sentence to match$
repeat
repeat('\\d') // -> \\d
repeat('\\d', 8) // -> \\d{8}
repeat('\\d', 1, 3) // -> \\d{1,3}
repeat('\\d', 1, Infinity) // -> \\d{1,}
numeric
Equivalent to rex.repeat.bind(null, '\\d')
alpha
Equivalent to rex.repeat.bind(null, '[A-z]')
and
and('a', 'b', 'c') // -> 'abc'
or
or('a', 'b', 'c') // -> 'a|b|c'
wildcard
and extra
wildcard('.') // -> '.*'
wildcard('.', true) // -> '.*?'
extra('.', matchers.LAZY) // -> '.+?'
extra('.', false) // -> '.+'
capture
capture('\\d+?') // -> (\\d+?)
or you can name your capture group with capture(pattern, name)
capture('\\d+?', 'number') // -> (?<number>\\d+?)
group
Similar to a capture(...), but won't keep the capture within the parentheses
group('.|\\s') // -> (?:.|\\s)
look.(ahead|behind).(positive|negative)
Creates a negative or positive look-ahead
look.ahead.positive('Y') === look.ahead('Y') // -> '(?=y)'
look.ahead.negative('Y') // -> '(?!y)'
look.behind.positive('Y') === look.behind('Y') // -> '(?<=y)'
look.behind.negative('Y') // -> '(?<!y)'
regex
Equal to RegExp
constructor
Matchers
ALPHA
:'[A-z]'
WORD
:'\\w'
NUMBER
:'\\d'
WHITE_SPACE
:'\\s'
ANY
:'.'
START
:'^'
END
:'$'
LAZY
:'?'
not
Matches opposite of matchers
regex(matchers.not.ALPHA) // -> '[^A-z]'
Flags
GLOBAL
:'g'
MULTI_LINE
:'m'
INSENSITIVE
:'i'
STICKY
:'y'
UNICODE
:'u'
Examples
See index.spec.js
for all the uses!
// found in `graphql-types-drivers-license`
// Matches all New York Driver's licenses
regex(
or(
and(alpha(1), numeric(7)),
and(alpha(1), numeric(18)),
and(numeric(8, 9)),
and(numeric(16)),
and(alpha(8))
)
)
// -> /[A-z]{1}\d{7}|[A-z]{1}\d{18}|\d{8,9}|\d{16}|[A-z]{8}/
// matches GraphQL queries/mutations
regex(
and(
capture(
and(
capture(or(...GQL_TYPES)),
extra(SPACE),
extra(WORD),
extra(SPACE),
wildGroup(and('on', extra(SPACE), extra(WORD)))
)
),
wildcard(SPACE),
wildGroup(
and(extraGroup(and('{', extraGroup(CHARS))), extraGroup(and('}', extraGroup(CHARS))))
),
'}'
),
flags.GLOBAL
)
// -> /((fragment|query|mutation|subscription)\s+\w+\s+(on\s+\w+)*)\s*(({(\s|\w|(".*")|:|,|\.|\)|\()+)+(}(\s|\w|(".*")|:|,|\.|\)|\()+)+)+}/g
Bonus
- Tiny!
- Super-readable!
- Changes make sense!