/regularity

A friendly regular expression builder for Ruby

Primary LanguageRubyMIT LicenseMIT

Regularity - Regular expressions for humans

Regularity is a friendly regular expression builder for Ruby. Regular expressions are a powerful way of pattern-matching against text, but too often they are 'write once, read never'. After all, who wants to try and deciper

/^[0-9]{3}-[A-Za-z]{2}#?[a|b]a{2,4}\$$/

when you could express it as:

Regularity.new
  .start_with(3, :digits)
  .then('-')
  .then(2, :letters)
  .maybe('#')
  .one_of(['a','b'])
  .between([2,4], 'a')
  .end_with('$')

While taking up a bit more space, Regularity expressions are much more readable than their cryptic counterparts.

Installation

gem install regularity

Usage

Regularity objects are just plain ol Ruby objects that act like regexes - method_missing delegates to a regex object, so you can go ahead and call =~ and match and all your other favorite methods on them and it will just work TM

DSL methods

Most methods accept the same pattern signature - you can either specify a patterned constraint such as then("xyz"), or a numbered constraint such as then(2, :digits). The following special identifers are supported:

:digit        => '[0-9]'
:lowercase    => '[a-z]'
:uppercase    => '[A-Z]'
:letter       => '[A-Za-z]'
:alphanumeric => '[A-Za-z0-9]'
:whitespace   => '\s'
:space        => ' '
:tab          => '\t'

It doesn't matter if the identifier is pluralized, i.e. then(2, :letters) works in addition to then(1, :letter)

The following methods are supported:

start_with(pattern): The line must start with the specified pattern

append(pattern): Append a pattern to the end (Also aliased to then)

end_with(pattern): The line must end with the specified pattern

maybe(pattern): Zero or one of the specified pattern

not(pattern): Specify a negative lookahead, i.e. something not followed by the specified pattern

one_of(values): Specify an alternation, e.g. one_of(['a', 'b', 'c'])

between(range, pattern): Specify a bounded repetition, e.g. between([2,4], :digits)

zero_or_more(pattern): Specify that the pattern or identifer should appear zero or many times

one_or_more(pattern): Specify that the pattern or identifer should appear one or many times

at_least(n, pattern): Specify that the pattern or identifer should appear n or more times

at_most(n, pattern): Specify that the pattern or identifer should appear n or less times

The DSL methods are chainable, meaning they return self. You can also call regex on a Regularity object to return a RegExp object created from the specified pattern.

Status

Build Status