如何检查字符串是否包含未转义的正则表达式控制字符?
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)
-> hello
和 hi
)。
因此模式 R"(^[^\[{()^$.*?|+]*$)"
将匹配常规字符串。
Pattern R"(^(?:\[\[{()^$.*?|+\]]|[^\[{()^$.*?|+])*$)"
将匹配常规字符串 + 仅包含转义特殊字符的字符串,因此您可以将 X
中的每个 \X
转换为具有常规字符串。
我正在编写使用 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)
-> hello
和 hi
)。
因此模式 R"(^[^\[{()^$.*?|+]*$)"
将匹配常规字符串。
Pattern R"(^(?:\[\[{()^$.*?|+\]]|[^\[{()^$.*?|+])*$)"
将匹配常规字符串 + 仅包含转义特殊字符的字符串,因此您可以将 X
中的每个 \X
转换为具有常规字符串。