compile-time-regular-expressions icon indicating copy to clipboard operation
compile-time-regular-expressions copied to clipboard

Support for subpatterns DEFINE

Open sandwoodK opened this issue 3 years ago • 2 comments

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.

sandwoodK avatar Oct 24 '22 19:10 sandwoodK

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

SirNate0 avatar Jul 24 '24 18:07 SirNate0

Since it's C++.. use a macro (or compile time literal string template that has + operator)

#define DEFINE "something"

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.

OlivierReubens avatar Aug 27 '24 12:08 OlivierReubens