hanickadot / compile-time-regular-expressions

Compile Time Regular Expression in C++
https://twitter.com/hankadusikova
Apache License 2.0
3.37k stars 186 forks source link

Support for subpatterns DEFINE #274

Open sandwoodK opened 2 years ago

sandwoodK commented 2 years ago

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.

SirNate0 commented 3 months 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
OlivierReubens commented 2 months ago

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.