gpt4 book ai didi

c++ - 基本 std::regex,将查询转换为有效掩码

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:56 26 4
gpt4 key购买 nike

<分区>

我需要使用两个特殊符号实现简单的正则表达式搜索 - 星号 (*) 作为任意数量的字符,问号 (?) 作为任意单个字符。查询中的任何其他符号都必须按原样解释。

主要问题是如何将输入掩码转换为有效的 std::regex 掩码。我正在将 * 翻译为 .* 和 ?作为 。 (点)。所有其他字符必须按原样转义或解释。这就是问题所在 - 如果我转义任何字符,std::regex 会引发异常,但以下字符除外:$^[\|.

如果我转义 ] 符号,它会引发异常。如果不转义 ] 符号,它会引发异常。所以我根本无法搜索 ] 符号。

我想,这是我的失败,我做错了什么。但我不明白我的失败在哪里。

我正在使用 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 函数将引发异常。请参阅 case L']': translate_mask 函数中的行

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com