C++的regex库正则表达式匹配汉字、字母和数字,运行程序报错异常

#include 
#include 
#include 

std::string filterText(const std::string& text)
{
    // 定义正则表达式,匹配非汉字、字母和数字的字符
    std::regex pattern("[^[:alnum:][:alpha:][\\u4e00-\\u9fa5]]");
    // 使用正则表达式去掉非汉字、字母和数字的字符
    std::string filteredText = std::regex_replace(text, pattern, "");
    return filteredText;
}

int main()
{
    std::string text = "Hello, 你好!123。";
    std::string filteredText = filterText(text);
    std::cout << filteredText << std::endl; // 输出:Hello你好123

    return 0;
}

报错:

0x75713522 处(位于 Project1.exe 中)有未经处理的异常: Microsoft C++ 异常: std::regex_error,位于内存位置 0x0095E9B8 处。

参考GPT:在运行程序时出现了std::regex_error异常,这可能是由于正则表达式的语法错误导致的。您可以尝试使用以下代码来检查正则表达式是否正确:

std::regex pattern;
try {
    pattern = "[^[:alnum:][:alpha:][\\u4e00-\\u9fa5]]";
} catch (const std::regex_error& e) {
    std::cout << "Regex error: " << e.what() << std::endl;
    return "";
}

如果正则表达式存在语法错误,该代码将抛出std::regex_error异常并打印错误信息。您可以根据错误信息修正正则表达式的语法错误。

另外,如果您在Windows系统中使用的是Visual Studio编译器,则需要在编译器选项中启用C++11或更高版本的支持。可以在编译器选项中添加"/std:c++latest"或"/std:c++11"等选项来启用C++11或更高版本的支持。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
异常 std::regex_error 表示在正则表达式操作中发生了错误,可能是正则表达式本身的问题,也可能是与正则表达式相关的输入字符串的问题。

在本例中,问题可能是正则表达式中使用了 Unicode 字符集,但未正确配置项目设置以支持使用宽字符集。在 Visual Studio 中,需要将项目属性的“常规”选项中的“字符集”设置为“使用 Unicode 字符集”,才能正确支持 Unicode 字符集,解决异常问题。

完整代码如下:

#include <regex>
#include <string>
#include <iostream>

std::wstring filterText(const std::wstring& text)
{
    // 定义正则表达式,匹配非汉字、字母和数字的字符
    std::wregex pattern(L"[^[:alnum:][:alpha:][\\u4e00-\\u9fa5]]");
    // 使用正则表达式去掉非汉字、字母和数字的字符
    std::wstring filteredText = std::regex_replace(text, pattern, L"");
    return filteredText;
}

int wmain()
{
    std::wstring text = L"Hello, 你好!123。";
    std::wstring filteredText = filterText(text);
    std::wcout << filteredText << std::endl; // 输出:Hello你好123

    return 0;
}

注意,在使用 std::regex 库时,如果要支持 Unicode 字符集,需要使用 std::wstring 和 std::wregex,以支持宽字符集。在代码中,std::wregex(pattern) 表示使用宽字符集的正则表达式,即支持 Unicode 字符集。
如果我的回答解决了您的问题,请采纳!

参考GPT和自己的思路:根据你提供的代码和报错信息,很可能是在使用正则表达式时出现了语法错误或者编译器版本不支持某些正则表达式的语法。建议排除以下几种可能的问题:

  1. 检查编译器是否支持正则表达式,如果不支持,在编译时加上对应的编译选项。比如在某些版本的VS中,需要在项目属性中的“C++”->“语言”->“C++语言标准”中选择"C++11"及以上才能支持正则表达式。
  2. 检查正则表达式语法是否正确。你的代码使用了Unicode编码,其中"[\u4e00-\u9fa5]"表示匹配所有汉字,但是有些编译器并不支持Unicode字符集,也有可能是Unicode字符集无法被正确编码(最常见于使用的编译器版本较旧)。可以修改为"[^[:alnum:][:alpha:]]"来匹配非字母和数字的字符,再进行测试。
  3. 检查你的代码中是否有其他错误。比如,调用regex_replace方法时,第一个参数传递了一个非法的正则表达式,或者正则表达式不符合特定编译器所支持的规则。

希望这些提示对你有帮助!

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:

该错误可能是由于正则表达式中使用了Unicode字符,但在Windows平台下默认情况下C++的regex库并不完全支持Unicode字符。要解决这个问题,可以考虑使用第三方库,例如Boost.Regex或PCRE(Perl Compatible Regular Expressions)。

以下是使用Boost.Regex的示例代码,可以匹配中文、英文、数字以及一些标点符号:

#include <iostream>
#include <string>
#include <boost/regex.hpp>

std::string filterText(const std::string& text)
{
    // 定义正则表达式,匹配汉字、字母和数字
    boost::regex pattern("[\\x{4e00}-\\x{9fa5}]|[a-zA-Z]|[0-9]|[.,!?]");
    // 使用正则表达式去掉非汉字、字母和数字的字符
    std::string filteredText = boost::regex_replace(text, pattern, "");
    return filteredText;
}

int main()
{
    std::string text = "Hello, 你好!123。";
    std::string filteredText = filterText(text);
    std::cout << filteredText << std::endl; // 输出:Hello你好123
 
    return 0;
}

注意,在使用Boost.Regex时,需要先安装Boost库并在编译时链接该库。

可能你的 C++ 标准库可能不支持 std::regex这种语法,或者你的编译器版本可能不支持标准库中的某些特性,博主你可以检查一下

这个异常是因为你使用的正则表达式语法不正确,导致在运行时出现了regex_error异常。在这里,您的正则表达式模式中包含非法的语法,这会导致程序无法正确解析它。

要解决这个问题,您可以按照以下步骤进行操作:

将Unicode字符范围表示为宽字符(L"\u4e00-\u9fa5")而不是多字节字符("\u4e00-\u9fa5")。这可以通过在表达式中使用L前缀来实现,如下所示:

std::regex pattern("[^[:alnum:][:alpha:][\u4e00-\u9fa5]]");

为std::regex对象提供std::regex_constants::ECMAScript标志,这将强制将表达式解释为ECMAScript语法而不是POSIX语法,如下所示:
std::regex pattern(L"[^[:alnum:][:alpha:][\u4e00-\u9fa5]]", std::regex_constants::ECMAScript);

修改后的代码如下:

#include <regex>
#include <string>
#include <iostream>

std::string filterText(const std::string& text)
{
// 定义正则表达式,匹配非汉字、字母和数字的字符
std::regex pattern(L"[^[:alnum:][:alpha:][\u4e00-\u9fa5]]", std::regex_constants::ECMAScript);
// 使用正则表达式去掉非汉字、字母和数字的字符
std::string filteredText = std::regex_replace(text, pattern, "");
return filteredText;
}

int main()
{
std::string text = "Hello, 你好!123。";
std::string filteredText = filterText(text);
std::cout << filteredText << std::endl; // 输出:Hello你好123

return 0;
}

希望这能帮助到你。

这个错误是因为 std::regex 构造函数或正则表达式操作中的某个错误导致的。std::regex_error 是 std::regex 抛出的异常类型之一,用于表示与正则表达式相关的错误。

有可能是正则表达式本身的语法不正确,或者是正则表达式使用的平台不支持。如果你在编写正则表达式时使用了不支持的语法,例如不支持的转义字符或不支持的元字符等,可能会引发异常。此外,正则表达式还可能因为内存问题、缺少必要的库文件等原因而无法使用。

为了解决这个问题,你可以检查使用的正则表达式是否正确,如果可能的话可以尝试简化正则表达式。如果你确定正则表达式没有问题,还可以尝试更新你的编译器和操作系统,以确保它们支持 std::regex 库。

可以考虑以下修改:

使用传统的 C++ 字符串替代 std::string

#include <regex>
#include <string>
#include <iostream>

std::string filterText(const std::string& text)
{
    // 定义正则表达式,匹配非汉字、字母和数字的字符
    std::regex pattern("[^[:alnum:][:alpha:][\\u4e00-\\u9fa5]]");
    // 使用正则表达式去掉非汉字、字母和数字的字符
    std::string filteredText = std::regex_replace(text, pattern, "");
    return filteredText;
}

int main()
{
    std::string text = "Hello, 你好!123。";
    std::string filteredText = filterText(text);
    std::cout << filteredText << std::endl; // 输出:Hello你好123

    return 0;
}



可以改写为:

#include <regex.h>
#include <string>
#include <iostream>

std::string filterText(const std::string& text)
{
    // 定义正则表达式,匹配非汉字、字母和数字的字符
    regex_t regex;
    regcomp(&regex, "[^[:alnum:][:alpha:][\\u4e00-\\u9fa5]]", REG_EXTENDED|REG_ICASE);
    // 使用正则表达式去掉非汉字、字母和数字的字符
    std::string filteredText = std::regex_replace(text.c_str(), regex, "");
    regfree(&regex);
    return filteredText;
}

int main()
{
    std::string text = "Hello, 你好!123。";
    std::string filteredText = filterText(text);
    std::cout << filteredText << std::endl; // 输出:Hello你好123

    return 0;
}

用其他库替换 std::regex
如果你的编译器不支持 std::regex 库,你可以尝试使用其他正则表达式库,例如 Boost.Regex 或 PCRE。这些库可能需要你进行额外的配置和安装,并且可能具有不同的 API 和使用方式,具体取决于你选择的库

已经解决了。附上链接:http://t.csdn.cn/gV9aT