Moha_regex 1.12.4

An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs.
Documentation
[[test]]

name = "nothing-empty"

regex = []

haystack = ""

matches = []



[[test]]

name = "nothing-something"

regex = []

haystack = "wat"

matches = []



[[test]]

name = "ranges"

regex = '(?-u)\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b'

haystack = "num: 255"

matches = [[5, 8]]



[[test]]

name = "ranges-not"

regex = '(?-u)\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b'

haystack = "num: 256"

matches = []



[[test]]

name = "float1"

regex = '[-+]?[0-9]*\.?[0-9]+'

haystack = "0.1"

matches = [[0, 3]]



[[test]]

name = "float2"

regex = '[-+]?[0-9]*\.?[0-9]+'

haystack = "0.1.2"

matches = [[0, 3]]

match-limit = 1



[[test]]

name = "float3"

regex = '[-+]?[0-9]*\.?[0-9]+'

haystack = "a1.2"

matches = [[1, 4]]



[[test]]

name = "float4"

regex = '[-+]?[0-9]*\.?[0-9]+'

haystack = "1.a"

matches = [[0, 1]]



[[test]]

name = "float5"

regex = '^[-+]?[0-9]*\.?[0-9]+$'

haystack = "1.a"

matches = []



[[test]]

name = "email"

regex = '(?i-u)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'

haystack = "mine is jam.slam@gmail.com "

matches = [[8, 26]]



[[test]]

name = "email-not"

regex = '(?i-u)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'

haystack = "mine is jam.slam@gmail "

matches = []



[[test]]

name = "email-big"

regex = '''[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?'''

haystack = "mine is jam.slam@gmail.com "

matches = [[8, 26]]



[[test]]

name = "date1"

regex = '^(?:19|20)\d\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])$'

haystack = "1900-01-01"

matches = [[0, 10]]

unicode = false



[[test]]

name = "date2"

regex = '^(?:19|20)\d\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])$'

haystack = "1900-00-01"

matches = []

unicode = false



[[test]]

name = "date3"

regex = '^(?:19|20)\d\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])$'

haystack = "1900-13-01"

matches = []

unicode = false



[[test]]

name = "start-end-empty"

regex = '^$'

haystack = ""

matches = [[0, 0]]



[[test]]

name = "start-end-empty-rev"

regex = '$^'

haystack = ""

matches = [[0, 0]]



[[test]]

name = "start-end-empty-many-1"

regex = '^$^$^$'

haystack = ""

matches = [[0, 0]]



[[test]]

name = "start-end-empty-many-2"

regex = '^^^$$$'

haystack = ""

matches = [[0, 0]]



[[test]]

name = "start-end-empty-rep"

regex = '(?:^$)*'

haystack = "a\nb\nc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]



[[test]]

name = "start-end-empty-rep-rev"

regex = '(?:$^)*'

haystack = "a\nb\nc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]



[[test]]

name = "neg-class-letter"

regex = '[^ac]'

haystack = "acx"

matches = [[2, 3]]



[[test]]

name = "neg-class-letter-comma"

regex = '[^a,]'

haystack = "a,x"

matches = [[2, 3]]



[[test]]

name = "neg-class-letter-space"

regex = '[^a[:space:]]'

haystack = "a x"

matches = [[2, 3]]



[[test]]

name = "neg-class-comma"

regex = '[^,]'

haystack = ",,x"

matches = [[2, 3]]



[[test]]

name = "neg-class-space"

regex = '[^[:space:]]'

haystack = " a"

matches = [[1, 2]]



[[test]]

name = "neg-class-space-comma"

regex = '[^,[:space:]]'

haystack = ", a"

matches = [[2, 3]]



[[test]]

name = "neg-class-comma-space"

regex = '[^[:space:],]'

haystack = " ,a"

matches = [[2, 3]]



[[test]]

name = "neg-class-ascii"

regex = '[^[:alpha:]Z]'

haystack = "A1"

matches = [[1, 2]]



[[test]]

name = "lazy-many-many"

regex = '(?:(?:.*)*?)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "lazy-many-optional"

regex = '(?:(?:.?)*?)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "lazy-one-many-many"

regex = '(?:(?:.*)+?)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "lazy-one-many-optional"

regex = '(?:(?:.?)+?)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "lazy-range-min-many"

regex = '(?:(?:.*){1,}?)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "lazy-range-many"

regex = '(?:(?:.*){1,2}?)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "greedy-many-many"

regex = '(?:(?:.*)*)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "greedy-many-optional"

regex = '(?:(?:.?)*)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "greedy-one-many-many"

regex = '(?:(?:.*)+)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "greedy-one-many-optional"

regex = '(?:(?:.?)+)='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "greedy-range-min-many"

regex = '(?:(?:.*){1,})='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "greedy-range-many"

regex = '(?:(?:.*){1,2})='

haystack = "a=b"

matches = [[0, 2]]



[[test]]

name = "empty1"

regex = ''

haystack = ""

matches = [[0, 0]]



[[test]]

name = "empty2"

regex = ''

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty3"

regex = '(?:)'

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty4"

regex = '(?:)*'

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty5"

regex = '(?:)+'

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty6"

regex = '(?:)?'

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty7"

regex = '(?:)(?:)'

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty8"

regex = '(?:)+|z'

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty9"

regex = 'z|(?:)+'

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty10"

regex = '(?:)+|b'

haystack = "abc"

matches = [[0, 0], [1, 1], [2, 2], [3, 3]]



[[test]]

name = "empty11"

regex = 'b|(?:)+'

haystack = "abc"

matches = [[0, 0], [1, 2], [3, 3]]