|
REAL
Regular Expression Algorithmic Library — constexpr C++20 regex
|
A compiled regular expression, parameterized on its storage policy. More...
#include <real.hpp>
Public Types | |
| using | result_type = basic_match_result< typename Storage::slot_storage > |
| This regex's match-result type. | |
Public Member Functions | |
| constexpr | basic_regex (std::string_view pattern, flags compile_flags=flags::none) |
Compiles pattern at run time (the real::regex constructor). | |
| constexpr | basic_regex ()=default |
| Default constructor for the stateless compile-time storage (static_regex). | |
| constexpr result_type | match (std::string_view text) const |
Match anchored at the start of text (Python re.match). | |
| constexpr result_type | fullmatch (std::string_view text) const |
Match the entire text (Python re.fullmatch). | |
| constexpr result_type | search (std::string_view text) const |
Leftmost match anywhere in text (Python re.search). | |
| constexpr result_type | match (std::string_view text, std::size_t pos, std::size_t endpos=npos) const |
Region-aware match: anchored at pos within text[0:endpos] (Python re.match with pos / endpos). Byte offsets; pos is not a slice (see run — \A fails at pos > 0); endpos defaults to the end of text. | |
| constexpr result_type | fullmatch (std::string_view text, std::size_t pos, std::size_t endpos=npos) const |
Region-aware fullmatch: the whole region [pos, endpos) must match. | |
| constexpr result_type | search (std::string_view text, std::size_t pos, std::size_t endpos=npos) const |
Region-aware search: leftmost match within [pos, endpos). | |
| constexpr result_type | match (const char *text) const |
match overload for string literals. | |
| constexpr result_type | fullmatch (const char *text) const |
fullmatch overload for string literals. | |
| constexpr result_type | search (const char *text) const |
search overload for string literals. | |
| constexpr basic_match_range< Storage > | find_iter (std::string_view text) const & |
Lazy range over all non-overlapping matches (Python re.finditer). | |
| constexpr basic_match_range< Storage > | find_iter (const char *text) const & |
find_iter overload for string literals. | |
| constexpr basic_match_range< Storage > | find_iter (std::string_view text, std::size_t pos, std::size_t endpos=npos) const & |
Region-aware find_iter: iterate matches within [pos, endpos) (Python finditer with pos / endpos). endpos truncates the subject to a view so iteration stops at it; pos is the start, not a slice (see run). Byte offsets; endpos defaults to the end of text. | |
| constexpr basic_match_range< Storage > | find_iter_longest (std::string_view text, std::size_t pos=0, std::size_t endpos=npos) const & |
Experimental leftmost-**longest** find_iter: iterate matches with POSIX (leftmost-longest) bounds rather than the default leftmost-first — the iterator twin of search_longest, sharing its prototype status (the match_semantics arc is not yet stable). Region semantics match find_iter — endpos truncates the subject to a view, pos is the start (not a slice). Byte offsets; captures are the winning thread's, not POSIX submatch. Every fast path is bypassed. | |
| basic_match_range< Storage > | find_iter_longest (std::string_view, std::size_t, std::size_t) const &&=delete |
Deleted: find_iter_longest on a temporary regex would dangle. | |
| basic_match_range< Storage > | find_iter (std::string_view text) const &&=delete |
Deleted: find_iter on a temporary regex would dangle. | |
| basic_match_range< Storage > | find_iter (const char *text) const &&=delete |
Deleted: find_iter on a temporary regex would dangle. | |
| basic_match_range< Storage > | find_iter (std::string_view text, std::size_t, std::size_t=npos) const &&=delete |
Deleted: region find_iter on a temporary regex would dangle. | |
| constexpr std::vector< result_type > | find_all (std::string_view text) const & |
All matches, eagerly (like Python re.findall but full results). | |
| constexpr std::vector< result_type > | find_all (const char *text) const & |
find_all overload for string literals. | |
| std::vector< result_type > | find_all (std::string_view text) const &&=delete |
Deleted: find_all on a temporary regex would dangle. | |
| std::vector< result_type > | find_all (const char *text) const &&=delete |
Deleted: find_all on a temporary regex would dangle. | |
| constexpr std::string | replace (std::string_view text, std::string_view replacement, std::size_t max_count=0) const |
Replaces matches in text (Python re.sub). | |
| constexpr std::vector< std::string_view > | split (std::string_view text, std::size_t max_splits=0) const |
Splits text on matches (Python re.split). | |
| constexpr std::vector< std::string_view > | split (const char *text, std::size_t max_splits=0) const |
split overload for string literals. | |
| result_type | match (const std::string &&text) const =delete |
| Deleted: temporary text would dangle. | |
| result_type | fullmatch (const std::string &&text) const =delete |
| Deleted: temporary text would dangle. | |
| result_type | search (const std::string &&text) const =delete |
| Deleted: temporary text would dangle. | |
| result_type | match (const std::string &&text, std::size_t, std::size_t=npos) const =delete |
| Deleted: temporary text would dangle. | |
| result_type | fullmatch (const std::string &&text, std::size_t, std::size_t=npos) const =delete |
| Deleted: temporary text would dangle. | |
| result_type | search (const std::string &&text, std::size_t, std::size_t=npos) const =delete |
| Deleted: temporary text would dangle. | |
| basic_match_range< Storage > | find_iter (const std::string &&text) const &=delete |
| Deleted: temporary text would dangle. | |
| basic_match_range< Storage > | find_iter (const std::string &&text, std::size_t, std::size_t=npos) const &=delete |
| Deleted: temporary text would dangle. | |
| std::vector< result_type > | find_all (const std::string &&text) const &=delete |
| Deleted: temporary text would dangle. | |
| std::vector< std::string_view > | split (const std::string &&text, std::size_t max_splits=0) const =delete |
| Deleted: temporary text would dangle. | |
| constexpr std::string_view | pattern () const |
| Returns the pattern text this regex was compiled from. | |
| constexpr flags | compile_flags () const |
| Returns the effective flags (constructor flags merged with a (?ims) prefix). | |
| constexpr std::size_t | group_count () const |
| Returns the number of capturing groups (excluding group 0). | |
| constexpr detail::program_view | raw_program () const |
| The raw compiled program, for embedders (advanced). | |
| constexpr bool | has_first_byte_set () const noexcept |
| Whether first-byte filtering is useful for this pattern. | |
| constexpr std::optional< unsigned char > | unique_first_byte () const noexcept |
| The single byte every non-empty match must begin with, if unique. | |
| constexpr bool | may_start_with (unsigned char byte) const noexcept |
Whether a non-empty match can begin with byte (sound, conservative). | |
| constexpr std::size_t | group_index (std::string_view name) const |
| Resolves a group name to its number. | |
| constexpr std::vector< std::pair< std::string_view, std::size_t > > | named_groups () const |
| All named groups as (name, number) pairs, in declaration order. | |
| result_type | search_longest (std::string_view text) const |
EXPERIMENTAL, opt-in: a single leftmost-**longest** search (POSIX / RE2 set_longest_match), the default leftmost-first semantics left untouched. Among matches at the leftmost start it returns the longest; a lazy quantifier therefore behaves greedily, and captures are the leftmost-first thread's at that longest bound (not POSIX submatch). Runs on the general Pike loop (the first-match DFA / inner-literal fast paths are bypassed). A prototype for the match_semantics arc — not yet a stable API. Its iteration twin is find_iter_longest. | |
| result_type | search_longest (std::string_view text, std::size_t pos, std::size_t endpos=npos) const |
Region-aware form of search_longest — leftmost-longest search within [pos, endpos). pos is the start (not a slice, per run); endpos truncates the subject. Byte offsets. | |
Private Member Functions | |
| constexpr std::string_view | name_of (const detail::named_group &named_group) const |
| Returns its name, sliced from the pattern text. | |
| constexpr void | expand_replacement (std::string &out, const result_type &match, std::string_view replacement) const |
Appends replacement to out, substituting group references. | |
| constexpr result_type | run (std::string_view text, detail::run_mode mode) const |
| Runs a single match attempt from offset 0 (backs match/search/fullmatch). | |
| constexpr result_type | run (std::string_view text, std::size_t pos, std::size_t endpos, detail::run_mode mode, match_semantics sem=match_semantics::first) const |
Region-aware single attempt: match over text[0:endpos] starting at pos. | |
Private Attributes | |
| Storage | program_ |
| The storage policy holding the compiled program. | |
A compiled regular expression, parameterized on its storage policy.
Storage owns the program; matching allocates only per-run scratch — and nothing at all when the storage is compile-time. Use the real::regex and real::static_regex aliases rather than this template directly.
| Storage | real::detail::dynamic_storage or real::detail::static_storage. |
| using real::basic_regex< Storage >::result_type = basic_match_result<typename Storage::slot_storage> |
|
inlineexplicitconstexpr |
Compiles pattern at run time (the real::regex constructor).
| [in] | pattern | The pattern text. |
| [in] | compile_flags | Optional flags (merged with a leading (?ims)). |
| real::regex_error | on an invalid or over-limit pattern. |
|
constexprdefault |
Default constructor for the stateless compile-time storage (static_regex).
|
inlineconstexpr |
|
inlineconstexprprivate |
Appends replacement to out, substituting group references.
Strict like Python: an invalid or out-of-range reference is an error.
| [in,out] | out | The output string to append to. |
| [in] | match | The match supplying the captured groups. |
| [in] | replacement | The replacement template ($$, $&, $1, ${name}). |
| real::regex_error | on a malformed or out-of-range reference. |
|
inlineconstexpr |
|
delete |
Deleted: find_all on a temporary regex would dangle.
|
delete |
Deleted: temporary text would dangle.
|
inlineconstexpr |
|
delete |
Deleted: find_all on a temporary regex would dangle.
|
inlineconstexpr |
|
delete |
Deleted: find_iter on a temporary regex would dangle.
|
delete |
Deleted: temporary text would dangle.
|
delete |
Deleted: temporary text would dangle.
|
inlineconstexpr |
Lazy range over all non-overlapping matches (Python re.finditer).
Only callable on an lvalue regex: calling on a temporary would dangle in a C++20 range-for (the range initializer's temporaries die before the loop body), so that misuse is a compile error (deleted rvalue overloads).
| [in] | text | The subject text (must outlive the range). |
|
delete |
Deleted: find_iter on a temporary regex would dangle.
|
inlineconstexpr |
|
delete |
Deleted: region find_iter on a temporary regex would dangle.
|
inlineconstexpr |
Experimental leftmost-**longest** find_iter: iterate matches with POSIX (leftmost-longest) bounds rather than the default leftmost-first — the iterator twin of search_longest, sharing its prototype status (the match_semantics arc is not yet stable). Region semantics match find_iter — endpos truncates the subject to a view, pos is the start (not a slice). Byte offsets; captures are the winning thread's, not POSIX submatch. Every fast path is bypassed.
|
delete |
Deleted: find_iter_longest on a temporary regex would dangle.
|
inlineconstexpr |
|
delete |
Deleted: temporary text would dangle.
|
delete |
Deleted: temporary text would dangle.
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
Resolves a group name to its number.
| [in] | name | The group name. |
|
inlineconstexprnoexcept |
Whether first-byte filtering is useful for this pattern.
true iff every non-empty match provably begins with a byte from a known set, so may_start_with can reject positions. false when a zero-length match is possible (or the set is empty) — then may_start_with is true for every byte and the filter buys nothing. This is the same set the engine's own prefilter uses, exposed for embedders (e.g. a lexer's rule dispatch).
true if the first-byte set is usable.
|
inlineconstexpr |
|
delete |
Deleted: temporary text would dangle.
|
delete |
Deleted: temporary text would dangle.
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexprnoexcept |
Whether a non-empty match can begin with byte (sound, conservative).
A false result is a guarantee: no non-empty match of this pattern begins with byte. A true result is a conservative superset — it does not promise a match actually starts there. When first-byte filtering is not usable (has_first_byte_set is false, i.e. an empty match is possible), this returns true for every byte, so it is safe to use on its own.
| [in] | byte | The candidate leading byte. |
false only when byte can never start a non-empty match.
|
inlineconstexprprivate |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
The raw compiled program, for embedders (advanced).
Lets an embedder (e.g. the Python binding) drive detail::pike_vm with caller-owned reusable scratch. Valid as long as this regex is alive.
|
inlineconstexpr |
Replaces matches in text (Python re.sub).
The replacement may reference groups: $$ → '$', $& or $0 → whole match, $1 …, and ${name}. Returns an owning string, so a temporary text is fine here.
| [in] | text | The subject text. |
| [in] | replacement | The replacement template. |
| [in] | max_count | Maximum replacements (0 = all). |
| real::regex_error | on a malformed group reference in replacement. |
|
inlineconstexprprivate |
|
inlineconstexprprivate |
Region-aware single attempt: match over text[0:endpos] starting at pos.
pos is the VM start offset, not a slice — zero-width assertions still see the absolute position, so \A and ^ (non-multiline) fail at pos > 0, matching Python re. endpos truncates the subject to a view (no copy), so $ / \Z treat it as the end. endpos is clamped to the text length; pos > endpos yields no match. Capture offsets are absolute byte offsets in text.
| [in] | text | The full subject (offsets are relative to it; must outlive the result). |
| [in] | pos | Byte offset to start matching at. |
| [in] | endpos | Byte offset of the exclusive region end; npos = end of text. |
| [in] | mode | The anchoring mode. |
| [in] | sem | Match semantics: leftmost-first (default) or the experimental leftmost-longest. |
text.
|
inlineconstexpr |
|
delete |
Deleted: temporary text would dangle.
|
delete |
Deleted: temporary text would dangle.
|
inlineconstexpr |
|
inlineconstexpr |
|
inline |
EXPERIMENTAL, opt-in: a single leftmost-**longest** search (POSIX / RE2 set_longest_match), the default leftmost-first semantics left untouched. Among matches at the leftmost start it returns the longest; a lazy quantifier therefore behaves greedily, and captures are the leftmost-first thread's at that longest bound (not POSIX submatch). Runs on the general Pike loop (the first-match DFA / inner-literal fast paths are bypassed). A prototype for the match_semantics arc — not yet a stable API. Its iteration twin is find_iter_longest.
|
inline |
Region-aware form of search_longest — leftmost-longest search within [pos, endpos). pos is the start (not a slice, per run); endpos truncates the subject. Byte offsets.
|
inlineconstexpr |
|
delete |
Deleted: temporary text would dangle.
|
inlineconstexpr |
Splits text on matches (Python re.split).
Each capturing group's text is inserted after its split (an unset group yields an empty view, where Python would use None).
| [in] | text | The subject text (must outlive the returned views). |
| [in] | max_splits | Maximum splits (0 = split everywhere). |
|
inlineconstexprnoexcept |
|
private |