# ctre

A compile-time (almost) PCRE-compatible regular expression matcher for C++.

# Overview

Fast compile-time regular expressions with support for matching/searching/capturing at compile-time or runtime.

    ctre::match<"REGEX">(subject); // C++20
    "REGEX"_ctre.match(subject); // C++17 + N3599 extension

- API
  - `fixed_string`
  - `regex_results`
  - `captured_content`
  - `match()`
  - `match()`
  - `search()`
  - `search()`
- Examples
  - Extracting a number from input
  - Extracting values from date
  - Lexer
  - Range over input
- Regex Syntax

# Supported compilers

- clang 6.0+ (template UDL, C++17 syntax)

- xcode clang 10.0+ (template UDL, C++17 syntax)

- gcc 7.4+ (template UDL, C++17 syntax)

- gcc 9.0+ (C++17 & C++20 cNTTP syntax)

- MSVC 15.8.8+ (C++17 syntax only)

# Basic Usage

## Template UDL syntax

Compiler must support N3599 extension, as GNU extension in gcc (not in GCC 9.1+) and clang.

    constexpr auto match(std::string_view sv) noexcept {
          using namespace ctre::literals;
          return "h.*"_ctre.match(sv);
    }

If you need N3599 extension in GCC 9.1+ you can’t use -pedantic mode and define the macro `CTRE_ENABLE_LITERALS`.

## C++17 syntax

You can provide pattern as a constexpr `ctll::fixed_string variable`.

    static constexpr auto pattern = ctll::fixed_string{ "h.*" };

    constexpr auto match(std::string_view sv) noexcept {
          return ctre::match<pattern>(sv);
    }

(this is tested in MSVC 15.8.8)

## C++20 syntax

Currently only compiler which supports cNTTP syntax `ctre::match<PATTERN>(subject)` is GCC 9+.

    constexpr auto match(std::string_view sv) noexcept {
          return ctre::match<"h.*">(sv);
    }