// -*- mode: c++ -*- // $Id$ // http://www.bagley.org/~doug/shootout/ // From Bill Lear #include #include using namespace std; typedef pair span; int main(int ac, char* av[]) { zopyra::regx re( "(?x) # set extended flag for embedded comment fun\n" "(?:^|[^\\d(]) # must be preceded by non-digit\n" "([(])? # match 1: possible initial left paren\n" "(\\d{3}) # match 2: area code is 3 digits\n" "(?(1)[)]) # if match1 then match right paren\n" "[ ] # area code followed by one space\n" "(\\d{3}) # match 3: prefix of 3 digits\n" "[- ] # separator is either space or dash\n" "(\\d{4}) # match 4: last 4 digits\n" "(?:\\D|\\b) # followed by non-digit or break\n" ); string line; vector lines; while (getline(cin, line)) { char* phone = new char[line.size()]; copy(line.begin(), line.end(), phone); lines.push_back(span(phone, phone + line.size())); } size_t ITER = (ac == 2 ? (atoi(av[1]) < 1 ? 1 : atoi(av[1])): 1); char num[13]; num[0] = '('; num[4] = ')'; num[5] = ' '; num[9] = '-'; size_t count = 0; while (ITER--) { vector::iterator end = lines.end(); for (vector::iterator i = lines.begin(); i != end; ++i) { zopyra::regx::iterator p = re.find(i->first, i->second); if (p++ != re.end()) { char* num_p = &num[1]; ++p; copy(p->first, p->second, num_p); num_p = &num[6]; ++p; copy(p->first, p->second, num_p); num_p = &num[10]; ++p; copy(p->first, p->second, num_p); if (!ITER) { cout << ++count << ": "; copy(num, num + 14, ostream_iterator(cout)); cout << '\n'; } } } } }