1 // Copyright 2010 The RE2 Authors. All Rights Reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #ifndef RE2_SET_H_ 6 #define RE2_SET_H_ 7 8 #include <string> 9 #include <utility> 10 #include <vector> 11 12 #include "re2/re2.h" 13 14 namespace re2 { 15 class Prog; 16 class Regexp; 17 } // namespace re2 18 19 namespace re2 { 20 21 // An RE2::Set represents a collection of regexps that can 22 // be searched for simultaneously. 23 class RE2::Set { 24 public: 25 enum ErrorKind { 26 kNoError = 0, 27 kNotCompiled, // The set is not compiled. 28 kOutOfMemory, // The DFA ran out of memory. 29 kInconsistent, // The result is inconsistent. This should never happen. 30 }; 31 32 struct ErrorInfo { 33 ErrorKind kind; 34 }; 35 36 Set(const RE2::Options& options, RE2::Anchor anchor); 37 ~Set(); 38 39 // Adds pattern to the set using the options passed to the constructor. 40 // Returns the index that will identify the regexp in the output of Match(), 41 // or -1 if the regexp cannot be parsed. 42 // Indices are assigned in sequential order starting from 0. 43 // Errors do not increment the index; if error is not NULL, *error will hold 44 // the error message from the parser. 45 int Add(const StringPiece& pattern, std::string* error); 46 47 // Compiles the set in preparation for matching. 48 // Returns false if the compiler runs out of memory. 49 // Add() must not be called again after Compile(). 50 // Compile() must be called before Match(). 51 bool Compile(); 52 53 // Returns true if text matches at least one of the regexps in the set. 54 // Fills v (if not NULL) with the indices of the matching regexps. 55 // Callers must not expect v to be sorted. 56 bool Match(const StringPiece& text, std::vector<int>* v) const; 57 58 // As above, but populates error_info (if not NULL) when none of the regexps 59 // in the set matched. This can inform callers when DFA execution fails, for 60 // example, because they might wish to handle that case differently. 61 bool Match(const StringPiece& text, std::vector<int>* v, 62 ErrorInfo* error_info) const; 63 64 private: 65 typedef std::pair<std::string, re2::Regexp*> Elem; 66 67 RE2::Options options_; 68 RE2::Anchor anchor_; 69 std::vector<Elem> elem_; 70 re2::Prog* prog_; 71 bool compiled_; 72 int size_; 73 74 Set(const Set&) = delete; 75 Set& operator=(const Set&) = delete; 76 }; 77 78 } // namespace re2 79 80 #endif // RE2_SET_H_ 81