bool Match(const string& input_string, bool full_match, string* matched_string) const { if (!utf8_regexp_.get()) { return false; } IcuRegExpInput input(input_string); UErrorCode status = U_ZERO_ERROR; const scoped_ptr<RegexMatcher> matcher( utf8_regexp_->matcher(*input.Data(), status)); bool match_succeeded = full_match ? matcher->matches(input.position(), status) : matcher->find(input.position(), status); if (!match_succeeded || U_FAILURE(status)) { return false; } if (matcher->groupCount() > 0 && matched_string) { *matched_string = UnicodeStringToUtf8String(matcher->group(1, status)); } return !U_FAILURE(status); }
virtual bool Consume(RegExpInput* input_string, bool anchor_at_start, string* matched_string1, string* matched_string2, string* matched_string3) const { DCHECK(input_string); if (!utf8_regexp_.get()) { return false; } IcuRegExpInput* const input = static_cast<IcuRegExpInput*>(input_string); UErrorCode status = U_ZERO_ERROR; const scoped_ptr<RegexMatcher> matcher( utf8_regexp_->matcher(*input->Data(), status)); bool match_succeeded = anchor_at_start ? matcher->lookingAt(input->position(), status) : matcher->find(input->position(), status); if (!match_succeeded || U_FAILURE(status)) { return false; } string* const matched_strings[] = { matched_string1, matched_string2, matched_string3 }; // If less matches than expected - fail. for (size_t i = 0; i < arraysize(matched_strings); ++i) { if (matched_strings[i]) { // Groups are counted from 1 rather than 0. const int group_index = i + 1; if (group_index > matcher->groupCount()) { return false; } *matched_strings[i] = UnicodeStringToUtf8String(matcher->group(group_index, status)); } } input->set_position(matcher->end(status)); return !U_FAILURE(status); }