Open sandwoodK opened 2 years ago
While it is not intuitive to me, I believe ?(DEFINE)
is a conditional pattern, though I'm not all that familiar with PCRE (it is listed in the PCRE doc's CONDITIONAL PATTERNS section at least). And conditional patterns are mentioned in the readme as being unsupported:
The library is implementing most of the PCRE syntax with a few exceptions:
- callouts
- comments
- conditional patterns
Since it's C++.. use a macro (or compile time literal string template that has + operator)
auto ret = ctre::match<"(?(" DEFINE ")(?<byte2.....">(teststring);
DEFINE can't by a dynamic pattern determined at runtime... then it would no longer be CTre
You can however achieve that by splitting it all up into 2 ctre matches (the bit before and the bit after DEFINE) and a std::regex match for the dynamic DEFINE pattern. combining the 3 may be somewhat complicated depending on the entire pattern seems fairly simple here since the DEFINE isn't repeated.
example : some IPV4 pcre using a DEFINE.
(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}\b
Can not find anywhere in the documentation that this is not supported but it does not compile.
Supporting this would certainly help adoption of CTRE because as far as i know this is the only possible way of doing reuse in pcre.