基本std::regex,将查询转换为有效掩码
basic std::regex, translate query to valid mask
我需要用两个特殊的simbols实现简单的regex搜索-星号(*)作为任意数量的字符,问号(?)作为任意单个字符。查询中的任何其他符号都必须按原样解释。
主要问题是如何将输入掩码转换为有效的std::regex掩码。我把*翻译成.*和?像(点)。所有其他字符都必须转义或按原样解释。问题是,如果我转义任何字符,std::regex都会引发异常,但以下字符除外:$^[\|.
它引发了一个例外,如果我逃离符号。如果不转义]符号,则会引发一个异常。所以我根本无法搜索]sign。
我想,这是我的失败,我做错了什么。但我不明白我的失败在哪里。
我使用的是VS 2017和C++17选项。
#include <string>
#include <regex>
void translate_mask (std::wstring & mask)
{
std::wstring basic (L"^");
for (auto c : mask)
{
switch (c)
{
case L'*':
basic += L".*";
break;
case L'?':
basic += L'.';
break;
case L'$':
case L'^':
case L'[':
case L'':
case L'|':
case L'.':
basic += L'' + std::wstring (1, c);
break;
case L']':
basic += L'.'; // workaround? ']' char cannot be escaped, so interpret it is as any single char
// uncomment any of these lines and exception will be raisen from std::wregex ctor
//basic += L'' + std::wstring (1, c);
//basic += c;
break;
default:
basic += c;
}
}
basic += L'$';
mask = std::move (basic);
}
void load_string (std::wstring & str)
{
// load string from some database, for example
str = L"[ hello | world of stack ]";
}
bool find (const std::wstring & str, const std::wstring & mask)
{
try
{
std::wregex r (mask, std::wregex::basic);
std::wsmatch m;
return std::regex_search (str, m, r);
}
catch (...)
{
return false;
}
}
int main ()
{
std::wstring mask, str;
// std::wcin >> mask;
// example input:
mask = L"[ hello | world of * ]";
load_string (str);
translate_mask (mask);
bool res = find (str, mask); // returns true
return 0;
}
如果我试图将"]"字符转义为"\]",find函数将引发异常。如果我根本不转义"]",find函数将引发一个异常。请参阅translate_mask
功能中的case L']':
行
您使用的是basic
语法(原因不清楚,因为您似乎是根据ECMASCript语法进行思考的)。在该语法中,管道|
并不特殊,不应转义。]
有点特殊,但只是作为一个括号表达式的一部分(当你逃离[
时,你不会有它);除此之外,它不应该逃脱。
有了这些更改,您的示例就起作用了。
注意还有其他特殊字符,例如括号()
和大括号{}
相关文章:
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 将 C 函数转换为 C++ 以检查数字是否有效
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 可以有效地转换 std::any 与 std::any_cast
- 如何有效地将一个大std::字符串的一部分转换为float
- static_cast:转换函数模板——它们真的有效吗
- 隐式转换:以下警告是否有效?
- 将第一个派生类转换为第二个派生类 - 为什么有效?
- 为什么此元组到引用元组 (std::tie) 转换有效?
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- 如何有效地将C / C++逻辑转换为python?
- 是否存在将长整型转换为指针有效的情况
- 最有效的安全方法将 std::map<int, std::shared_ptr> 转换为 std::<Base>map<int, std::shared_ptr<D
- reinterpret_cast可以将无效的指针值转换为有效的指针值
- 从nullptr_t转换为bool:有效与否
- 为什么C++隐式转换有效,而显式转换无效?
- 为什么 constexpr 隐式转换并不总是有效?
- 为什么 C 样式的转换有效,而reinterpret_cast则无效?
- 为什么"const int" "int"转换有效,但"const char[]"到"char *"不起作用
- 为什么向上转换有效,但向下转换会产生编译时错误