regex 0.1.55

An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs.
Documentation
#![allow(dead_code)]

extern crate rand;
extern crate regex;

use rand::{Rng, thread_rng};

macro_rules! regex {
    ($re:expr) => {{
        use regex::internal::ExecBuilder;
        ExecBuilder::new($re).build().unwrap().into_regex()
    }}
}

fn main() {
    println!("making input...");
    let input = make_input(10000000);
    println!("compiling regex...");
    let re = regex!("(a|b)*a(a|b){20}");
    println!("searching...");
    for m in re.find_iter(&input) {
        println!("{:?}", m);
    }

    // let input = "    Wed Nov  4 16:26:23 EST 2015";
    // let re = regex!(DATETIME);
    // for m in re.find_iter(&input) {
        // println!("{:?}", m);
    // }
}

fn make_input(size: usize) -> String {
    let mut rng = thread_rng();
    let mut s = String::with_capacity(size);
    for _ in 0..size {
        s.push(if rng.gen() { 'a' } else { 'b'});
    }
    s
}

static DATETIME: &'static str = "\
(?i)(?:(?:(?:(?:(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday)|(?:mon|tue[s]?|wed|thu[r]?|fri|sat|sun))(?:(?:[,])(?:(?:[ ]{1,4})?)|(?:[ ]{1,4})))?(?:(?:january|february|march|april|may|june|july|august|september|october|november|december)|(?:jan|feb|mar|apr|may|jun|jul|aug|sep[t]?|oct|nov|dec))(?:[ ]{1,4})(?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th))(?:[ ]{1,4})(?:(?:(?:(?:0?[0-9]|1[0-2]):[0-5][0-9](?::[0-5][0-9])?(?:(?:[ ]{1,4})?)[AP][M])(?:(?:[ ]{1,4})(?:acdt|acst|aedt|aest|akdt|akst|amst|awdt|awst|biot|brst|cedt|cest|chot|chut|cist|clst|cost|cwst|davt|ddut|east|eedt|eest|egst|fkst|galt|gamt|gilt|hadt|haec|hast|hovt|ibst|irdt|irkt|irst|kost|krat|lhst|lint|magt|mart|mawt|mest|mist|nzdt|nzst|omst|orat|pett|phot|pmdt|pmst|pont|pyst|rott|sakt|samt|sast|slst|sret|syot|taht|ulat|uyst|vlat|volt|vost|wakt|wast|wedt|west|yakt|yekt|act|adt|aft|amt|art|ast|azt|bdt|bit|bot|brt|bst|btt|cat|cct|cdt|cet|cit|ckt|clt|cot|cst|cvt|cxt|dft|eat|ect|edt|eet|egt|eit|est|fet|fjt|fkt|fnt|get|gft|git|gmt|gst|gyt|hkt|hmt|hst|ict|idt|iot|ist|jst|kgt|kst|mdt|met|mht|mit|mmt|msk|mst|mut|mvt|myt|nct|ndt|nft|npt|nst|nut|pdt|pet|pgt|pkt|pst|pyt|ret|sbt|sct|sgt|srt|sst|tft|tha|tjt|tkt|tlt|tmt|tot|tvt|uct|utc|uyt|uzt|vet|vut|wat|wet|wit|wst))?)|(?:(?:(?:[0-1]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9](?:[.][0-9][0-9])?)?)(?:(?:(?:(?:[ ]{1,4})?)(?:(?:acdt|acst|aedt|aest|akdt|akst|amst|awdt|awst|biot|brst|cedt|cest|chot|chut|cist|clst|cost|cwst|davt|ddut|east|eedt|eest|egst|fkst|galt|gamt|gilt|hadt|haec|hast|hovt|ibst|irdt|irkt|irst|kost|krat|lhst|lint|magt|mart|mawt|mest|mist|nzdt|nzst|omst|orat|pett|phot|pmdt|pmst|pont|pyst|rott|sakt|samt|sast|slst|sret|syot|taht|ulat|uyst|vlat|volt|vost|wakt|wast|wedt|west|yakt|yekt|act|adt|aft|amt|art|ast|azt|bdt|bit|bot|brt|bst|btt|cat|cct|cdt|cet|cit|ckt|clt|cot|cst|cvt|cxt|dft|eat|ect|edt|eet|egt|eit|est|fet|fjt|fkt|fnt|get|gft|git|gmt|gst|gyt|hkt|hmt|hst|ict|idt|iot|ist|jst|kgt|kst|mdt|met|mht|mit|mmt|msk|mst|mut|mvt|myt|nct|ndt|nft|npt|nst|nut|pdt|pet|pgt|pkt|pst|pyt|ret|sbt|sct|sgt|srt|sst|tft|tha|tjt|tkt|tlt|tmt|tot|tvt|uct|utc|uyt|uzt|vet|vut|wat|wet|wit|wst)|(?:[-+](?:0[0-9]|1[0-2])(?:(?:[:])?)(?:00|15|30|45))))|z)?))(?:[ ]{1,4})(?:[1-2][0-9][0-9][0-9]))|(?:(?:(?:(?:(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday)|(?:mon|tue[s]?|wed|thu[r]?|fri|sat|sun))(?:(?:[,])(?:(?:[ ]{1,4})?)|(?:[ ]{1,4})))?(?:(?:(?:(?:0?[1-9])|(?:1[0-2]))[-/](?:[0-2]?[0-9]|3[0-1])[-/](?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:[0-2]?[0-9]|3[0-1])[-/](?:(?:0?[1-9])|(?:1[0-2]))[-/](?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9]))[-/](?:(?:0?[1-9])|(?:1[0-2]))[-/](?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th)))|(?:(?:(?:january|february|march|april|may|june|july|august|september|october|november|december)|(?:jan|feb|mar|apr|may|jun|jul|aug|sep[t]?|oct|nov|dec))(?:[ ]{1,4})(?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th))(?:(?:[,])(?:(?:[ ]{1,4})?)|(?:[ ]{1,4}))(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th))(?:[ ]{1,4})(?:(?:january|february|march|april|may|june|july|august|september|october|november|december)|(?:jan|feb|mar|apr|may|jun|jul|aug|sep[t]?|oct|nov|dec))(?:(?:[,])?)(?:(?:[ ]{1,4})?)(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9]))))(?:(?:[ ]{1,4})|(?:(?:[ ]{1,4})?)[,@T](?:(?:[ ]{1,4})?))(?:(?:(?:(?:0?[0-9]|1[0-2]):[0-5][0-9](?::[0-5][0-9])?(?:(?:[ ]{1,4})?)[AP][M])(?:(?:[ ]{1,4})(?:acdt|acst|aedt|aest|akdt|akst|amst|awdt|awst|biot|brst|cedt|cest|chot|chut|cist|clst|cost|cwst|davt|ddut|east|eedt|eest|egst|fkst|galt|gamt|gilt|hadt|haec|hast|hovt|ibst|irdt|irkt|irst|kost|krat|lhst|lint|magt|mart|mawt|mest|mist|nzdt|nzst|omst|orat|pett|phot|pmdt|pmst|pont|pyst|rott|sakt|samt|sast|slst|sret|syot|taht|ulat|uyst|vlat|volt|vost|wakt|wast|wedt|west|yakt|yekt|act|adt|aft|amt|art|ast|azt|bdt|bit|bot|brt|bst|btt|cat|cct|cdt|cet|cit|ckt|clt|cot|cst|cvt|cxt|dft|eat|ect|edt|eet|egt|eit|est|fet|fjt|fkt|fnt|get|gft|git|gmt|gst|gyt|hkt|hmt|hst|ict|idt|iot|ist|jst|kgt|kst|mdt|met|mht|mit|mmt|msk|mst|mut|mvt|myt|nct|ndt|nft|npt|nst|nut|pdt|pet|pgt|pkt|pst|pyt|ret|sbt|sct|sgt|srt|sst|tft|tha|tjt|tkt|tlt|tmt|tot|tvt|uct|utc|uyt|uzt|vet|vut|wat|wet|wit|wst))?)|(?:(?:(?:[0-1]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9](?:[.][0-9][0-9])?)?)(?:(?:(?:(?:[ ]{1,4})?)(?:(?:acdt|acst|aedt|aest|akdt|akst|amst|awdt|awst|biot|brst|cedt|cest|chot|chut|cist|clst|cost|cwst|davt|ddut|east|eedt|eest|egst|fkst|galt|gamt|gilt|hadt|haec|hast|hovt|ibst|irdt|irkt|irst|kost|krat|lhst|lint|magt|mart|mawt|mest|mist|nzdt|nzst|omst|orat|pett|phot|pmdt|pmst|pont|pyst|rott|sakt|samt|sast|slst|sret|syot|taht|ulat|uyst|vlat|volt|vost|wakt|wast|wedt|west|yakt|yekt|act|adt|aft|amt|art|ast|azt|bdt|bit|bot|brt|bst|btt|cat|cct|cdt|cet|cit|ckt|clt|cot|cst|cvt|cxt|dft|eat|ect|edt|eet|egt|eit|est|fet|fjt|fkt|fnt|get|gft|git|gmt|gst|gyt|hkt|hmt|hst|ict|idt|iot|ist|jst|kgt|kst|mdt|met|mht|mit|mmt|msk|mst|mut|mvt|myt|nct|ndt|nft|npt|nst|nut|pdt|pet|pgt|pkt|pst|pyt|ret|sbt|sct|sgt|srt|sst|tft|tha|tjt|tkt|tlt|tmt|tot|tvt|uct|utc|uyt|uzt|vet|vut|wat|wet|wit|wst)|(?:[-+](?:0[0-9]|1[0-2])(?:(?:[:])?)(?:00|15|30|45))))|z)?)))|(?:(?:(?:(?:(?:0?[0-9]|1[0-2]):[0-5][0-9](?::[0-5][0-9])?(?:(?:[ ]{1,4})?)[AP][M])(?:(?:[ ]{1,4})(?:acdt|acst|aedt|aest|akdt|akst|amst|awdt|awst|biot|brst|cedt|cest|chot|chut|cist|clst|cost|cwst|davt|ddut|east|eedt|eest|egst|fkst|galt|gamt|gilt|hadt|haec|hast|hovt|ibst|irdt|irkt|irst|kost|krat|lhst|lint|magt|mart|mawt|mest|mist|nzdt|nzst|omst|orat|pett|phot|pmdt|pmst|pont|pyst|rott|sakt|samt|sast|slst|sret|syot|taht|ulat|uyst|vlat|volt|vost|wakt|wast|wedt|west|yakt|yekt|act|adt|aft|amt|art|ast|azt|bdt|bit|bot|brt|bst|btt|cat|cct|cdt|cet|cit|ckt|clt|cot|cst|cvt|cxt|dft|eat|ect|edt|eet|egt|eit|est|fet|fjt|fkt|fnt|get|gft|git|gmt|gst|gyt|hkt|hmt|hst|ict|idt|iot|ist|jst|kgt|kst|mdt|met|mht|mit|mmt|msk|mst|mut|mvt|myt|nct|ndt|nft|npt|nst|nut|pdt|pet|pgt|pkt|pst|pyt|ret|sbt|sct|sgt|srt|sst|tft|tha|tjt|tkt|tlt|tmt|tot|tvt|uct|utc|uyt|uzt|vet|vut|wat|wet|wit|wst))?)|(?:(?:(?:[0-1]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9](?:[.][0-9][0-9])?)?)(?:(?:(?:(?:[ ]{1,4})?)(?:(?:acdt|acst|aedt|aest|akdt|akst|amst|awdt|awst|biot|brst|cedt|cest|chot|chut|cist|clst|cost|cwst|davt|ddut|east|eedt|eest|egst|fkst|galt|gamt|gilt|hadt|haec|hast|hovt|ibst|irdt|irkt|irst|kost|krat|lhst|lint|magt|mart|mawt|mest|mist|nzdt|nzst|omst|orat|pett|phot|pmdt|pmst|pont|pyst|rott|sakt|samt|sast|slst|sret|syot|taht|ulat|uyst|vlat|volt|vost|wakt|wast|wedt|west|yakt|yekt|act|adt|aft|amt|art|ast|azt|bdt|bit|bot|brt|bst|btt|cat|cct|cdt|cet|cit|ckt|clt|cot|cst|cvt|cxt|dft|eat|ect|edt|eet|egt|eit|est|fet|fjt|fkt|fnt|get|gft|git|gmt|gst|gyt|hkt|hmt|hst|ict|idt|iot|ist|jst|kgt|kst|mdt|met|mht|mit|mmt|msk|mst|mut|mvt|myt|nct|ndt|nft|npt|nst|nut|pdt|pet|pgt|pkt|pst|pyt|ret|sbt|sct|sgt|srt|sst|tft|tha|tjt|tkt|tlt|tmt|tot|tvt|uct|utc|uyt|uzt|vet|vut|wat|wet|wit|wst)|(?:[-+](?:0[0-9]|1[0-2])(?:(?:[:])?)(?:00|15|30|45))))|z)?))(?:[ ]{1,4})(?:(?:(?:(?:0?[1-9])|(?:1[0-2]))[-/](?:[0-2]?[0-9]|3[0-1])[-/](?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:[0-2]?[0-9]|3[0-1])[-/](?:(?:0?[1-9])|(?:1[0-2]))[-/](?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9]))[-/](?:(?:0?[1-9])|(?:1[0-2]))[-/](?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th)))|(?:(?:(?:january|february|march|april|may|june|july|august|september|october|november|december)|(?:jan|feb|mar|apr|may|jun|jul|aug|sep[t]?|oct|nov|dec))(?:[ ]{1,4})(?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th))(?:(?:[,])(?:(?:[ ]{1,4})?)|(?:[ ]{1,4}))(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th))(?:[ ]{1,4})(?:(?:january|february|march|april|may|june|july|august|september|october|november|december)|(?:jan|feb|mar|apr|may|jun|jul|aug|sep[t]?|oct|nov|dec))(?:(?:[,])?)(?:(?:[ ]{1,4})?)(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9]))))))|(?:(?:(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday)|(?:mon|tue[s]?|wed|thu[r]?|fri|sat|sun))(?:(?:[,])(?:(?:[ ]{1,4})?)|(?:[ ]{1,4})))?(?:(?:(?:(?:0?[1-9])|(?:1[0-2]))[-/](?:[0-2]?[0-9]|3[0-1])[-/](?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:[0-2]?[0-9]|3[0-1])[-/](?:(?:0?[1-9])|(?:1[0-2]))[-/](?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9]))[-/](?:(?:0?[1-9])|(?:1[0-2]))[-/](?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th)))|(?:(?:(?:january|february|march|april|may|june|july|august|september|october|november|december)|(?:jan|feb|mar|apr|may|jun|jul|aug|sep[t]?|oct|nov|dec))(?:[ ]{1,4})(?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th))(?:(?:[,])(?:(?:[ ]{1,4})?)|(?:[ ]{1,4}))(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9])))|(?:(?:(?:[0-2]?[0-9]|3[0-1])|(?:[2-3]?1st|2?2nd|2?3rd|(?:[4-9]|1[0-9]|2[04-9]|30)th))(?:[ ]{1,4})(?:(?:january|february|march|april|may|june|july|august|september|october|november|december)|(?:jan|feb|mar|apr|may|jun|jul|aug|sep[t]?|oct|nov|dec))(?:(?:[,])?)(?:(?:[ ]{1,4})?)(?:(?:[1-2][0-9][0-9][0-9])|(?:[0-9][0-9]))))|(?:(?:(?:(?:january|february|march|april|may|june|july|august|september|october|november|december)|(?:jan|feb|mar|apr|may|jun|jul|aug|sep[t]?|oct|nov|dec))(?:(?:[,])(?:(?:[ ]{1,4})?)|(?:[ ]{1,4}))(?:[1-2][0-9][0-9][0-9]))|(?:(?:[1-2][0-9][0-9][0-9])[-/](?:(?:0?[1-9])|(?:1[0-2])))))";