(original) (raw)

/* ************************************************************** * C++ Mathematical Expression Toolkit Library * * * * ExprTk Symbol Regex And Validation * * Author: Arash Partow (1999-2024) * * URL: https://www.partow.net/programming/exprtk/index.html * * * * Copyright notice: * * Free use of the Mathematical Expression Toolkit Library is * * permitted under the guidelines and in accordance with the * * most current version of the MIT License. * * https://www.opensource.org/licenses/MIT * * SPDX-License-Identifier: MIT * * * ************************************************************** */ #include #include #include inline bool is_valid_exprtk_symbol(const std::string& symbol) { constexpr auto symbol_pattern = R"([a-zA-Z][a-zA-Z0-9_]*(\.[a-zA-Z0-9_]+)*)"; const std::regex regex(symbol_pattern, std::regex_constants::extended); std::smatch matches; return std::regex_match(symbol, matches, regex) && !matches.empty() && (matches[0].str() == symbol); } int main() { // Valid Symbols assert(is_valid_exprtk_symbol("a" )); assert(is_valid_exprtk_symbol("ab" )); assert(is_valid_exprtk_symbol("abc" )); assert(is_valid_exprtk_symbol("a1" )); assert(is_valid_exprtk_symbol("ab1" )); assert(is_valid_exprtk_symbol("abc1" )); assert(is_valid_exprtk_symbol("a.b" )); assert(is_valid_exprtk_symbol("a.b.c" )); assert(is_valid_exprtk_symbol("ab.cd" )); assert(is_valid_exprtk_symbol("abc.def" )); assert(is_valid_exprtk_symbol("a_.b_.c_" )); assert(is_valid_exprtk_symbol("a._b._c" )); assert(is_valid_exprtk_symbol("a1.b2" )); assert(is_valid_exprtk_symbol("a1.b2.c3" )); assert(is_valid_exprtk_symbol("a1_.b2_.c3_" )); assert(is_valid_exprtk_symbol("a1._b2._c3" )); // Invalid Symbols assert(!is_valid_exprtk_symbol("" )); assert(!is_valid_exprtk_symbol(" " )); assert(!is_valid_exprtk_symbol("1" )); assert(!is_valid_exprtk_symbol("a1?" )); assert(!is_valid_exprtk_symbol("1a" )); assert(!is_valid_exprtk_symbol("1.2" )); assert(!is_valid_exprtk_symbol("1a.2b.3c" )); assert(!is_valid_exprtk_symbol("a_$.b_^.c_*")); assert(!is_valid_exprtk_symbol("a..b" )); assert(!is_valid_exprtk_symbol("a..b.c" )); assert(!is_valid_exprtk_symbol("ab." )); assert(!is_valid_exprtk_symbol(".abc" )); assert(!is_valid_exprtk_symbol(".abc_" )); return 0; } /* Build: c++ -Wall -Wextra -Werror -std=c++11 -o exprtk_valid_symbol_regex exprtk_valid_symbol_regex.cpp */