Skip to content

mfix22/rexrex

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
September 27, 2019 10:45
September 8, 2017 14:55
January 28, 2019 21:39
December 2, 2020 17:27
March 28, 2020 20:43
February 25, 2019 10:04
February 25, 2019 10:06

🦖 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!