如何检查字符串是否包含未转义的正则表达式控制字符?

How to check if a string contains unescaped regex control characters?

我正在编写使用 C++ 标准库的 Basic RegEx 模式匹配的代码。所使用的模式匹配目前是一个瓶颈,我想优化一个简单字符串的常见情况(没有特殊的 RegEx 字符)。如何检查给定字符串是否包含未转义的 RegEx 特殊字符?我能够检测到特殊字符,但如果它们被转义,我将无法排除它们。

std::regex special_character("[\.\[\]\*\^$]*");
bool is_simple_string(std::string pat){
   return (bool) std::regex_match(pat, special_character);
}

编辑:我有一个正则表达式列表,我想检查哪个正则表达式匹配给定的字符串。我的正则表达式列表足够长,这是我程序中的性能瓶颈。我的大部分正则表达式都是简单的字符串(没有控制字符)。我正在尝试将其转换为 unordered_set 简单字符串和更小的复杂正则表达式列表。这样我就可以对简单的字符串执行恒定时间查找,而只需要费心处理一些复杂的正则表达式。

12/13 special characters for regex:

\ [ { ( ) ^ $ . * ? | + / ]

因此任何包含上述之一的模式都不能(直接)用作搜索字符串(即使已转义)。

如果您的模式仅包含常规字符和转义的特殊字符,您可以将该模式转换为常规字符串 (foo\(\) -> foo())。

更复杂的是转换模式只匹配集合中的几个集合((hello|hi) -> hellohi)。

因此模式 R"(^[^\[{()^$.*?|+]*$)" 将匹配常规字符串。

Pattern R"(^(?:\[\[{()^$.*?|+\]]|[^\[{()^$.*?|+])*$)" 将匹配常规字符串 + 仅包含转义特殊字符的字符串,因此您可以将 X 中的每个 \X 转换为具有常规字符串。