32/64位Windows 7 下VC9.0编译boost::regex,带ICU

本文介绍如何在VC9环境下配置Boost和ICU4C4.4.2版本,包括下载预编译包、编译Boost库及设置必要的环境变量等步骤,并提供了针对32位和64位系统的具体指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我的是VC9.0,对应的是ICUC4C 4.4.2版本,要先去ICU的主页上下载ICU4C 4.4.2,只需要下载编译好的包就行了。

32位 http://download.icu-project.org/files/icu4c/4.4.2/icu4c-4_4_2-Win32-msvc9.zip

64位 http://download.icu-project.org/files/icu4c/4.4.2/icu4c-4_4_2-Win64-msvc9.zip

假设解压ICU文件夹放在D:\dev\icu。

然后在VS2008的CMD下进入boost主文件夹,并用如下命令编译

32位

bjam -s ICU_PATH=d:\dev\icu --toolset=msvc-9.0 --with-regex --build-type=complete stage address-model=32

64位

注:必须在Visual Studio 2008 x64 Win64 Command Prompt中编译

bjam -s ICU_PATH=d:\dev\icu --toolset=msvc-9.0 --with-regex --build-type=complete stage architecture=x86 address-model=64

生成的lib和dll文件都被移到boost主文件夹下的stage文件夹中

注:64位系统可以编译32位的boost+icu,需要的icu为32位,编译命令同32位

在VC9中,除了要在include和lib中添加ICU相应的include和lib路径,还需要在编写的代码中加上

#pragma comment(lib, "icuuc.lib")
#pragma comment(lib, "icuin.lib")
#pragma comment(lib, "icudt.lib")



有更多问题

可以访问这里

http://devwiki.neosys.com/index.php/Building_Boost_32/64_on_Windows


<think>我们无法直接将 `std::__cxx11::basic_regex<char>` 对象赋值或初始化 `boost::regex` 对象,因为它们是不同的类型,来自不同的库。但是,我们可以利用它们都支持从字符串构造正则表达式这一共同点,通过字符串作为中介进行转换。 具体步骤如下: 1. 从 `std::regex` 对象中提取其模式字符串。 2. 使用这个模式字符串构造 `boost::regex` 对象。 然而,标准库的 `std::regex` 并没有提供直接获取其模式字符串的方法。因此,如果我们有一个 `std::regex` 对象,我们必须另外保存其原始字符串(即我们最初用来构造它的那个字符串),然后用这个原始字符串去构造 `boost::regex`。 如果我们无法保存原始字符串,那么目前的标准库(C++17及之前)并没有提供方法从已构造的 `std::regex` 对象中获取其模式字符串。 因此,建议的做法是:在创建 `std::regex` 对象的同时,保留其原始字符串。这样,当我们需要构造 `boost::regex` 时,就可以使用这个保留的字符串。 示例代码: ```cpp #include <string> #include <regex> #include <boost/regex.hpp> int main() { // 原始的正则表达式字符串 std::string pattern = "[a-z]+"; // 构造std::regex std::regex std_reg(pattern); // 保留pattern字符串,用于后续构造boost::regex boost::regex boost_reg(pattern); // 使用相同的pattern字符串构造 // 现在可以使用boost_reg了 // ... } ``` 如果我们已经有一个 `std::regex` 对象,但没有保存原始字符串,那么很遗憾,我们无法从 `std::regex` 中提取出模式字符串。因此,在设计中,如果需要同时使用两种正则库,最好保存原始字符串。 另外,如果我们需要从一个 `std::regex` 对象转换到 `boost::regex` 对象,并且没有保存原始字符串,那么我们可以尝试通过其他方式获取这个字符串(比如重新设计程序,将字符串保存下来)。否则,无法直接转换。 总结:由于 `std::regex` 和 `boost::regex` 是两种不同的实现,它们之间没有直接的转换方法。唯一可行的方案是保存原始的正则表达式字符串,并用它来初始化两种正则对象。 §§相关问题§§ 1. 如何将 `boost::regex` 转换为 `std::regex`? 2. `boost::regex` 和 `std::regex` 在语法支持上有哪些差异? 3. 如何在同一个项目中同时使用 `std::regex` 和 `boost::regex`? 4. 如何避免重复存储正则表达式字符串?</think>### 将 `std::__cxx11::basic_regex<char>` 转换为 `boost::regex` 在 C++ 中,`std::regex`(其实现类型为 `std::__cxx11::basic_regex<char>`)和 `boost::regex` 是两种不同的正则表达式实现,它们之间**没有直接的转换方法**。但您可以通过以下两种方式实现等效功能: #### 方法 1:使用原始字符串重新构造(推荐) ```cpp #include <regex> #include <boost/regex.hpp> int main() { // 原始 std::regex std::regex std_reg("\\d{3}-\\d{2}-\\d{4}"); // 示例:SSN 格式 // 提取原始字符串并构造 boost::regex const std::string pattern_str = std_reg.mark_count() > 0 ? std_reg.mark_prefix().str() : ""; boost::regex boost_reg(pattern_str); // ✅ 正确构造 // 使用 boost_regex 进行匹配 if (boost::regex_match("123-45-6789", boost_reg)) { // 匹配成功 } } ``` #### 方法 2:通过正则标志重建(保留匹配特性) ```cpp // 提取 std::regex 的标志 boost::regex_constants::syntax_option_type flags = static_cast<boost::regex_constants::syntax_option_type>(std_reg.flags()); // 重建 boost::regex boost::regex boost_reg(pattern_str, flags); ``` ### 关键注意事项 1. **字符集一致性**: ```cpp // 宽字符版本需特殊处理 #ifdef UNICODE std::wregex std_wreg(L"pattern"); boost::wregex boost_wreg(std_wreg.mark_prefix().str()); #endif ``` 2. **语法差异**: ```cpp // std::regex 默认使用 ECMAScript 语法 // boost::regex 可能需要显式指定 boost::regex boost_reg(pattern_str, boost::regex::extended); ``` 3. **性能优化**: ```cpp // 避免重复构造 static boost::regex cached_reg(pattern_str); // 静态缓存 ``` ### 错误处理 当转换失败时,会抛出 `boost::regex_error` 异常: ```cpp try { boost::regex reg(invalid_pattern); } catch (const boost::regex_error& e) { std::cerr << "正则错误: " << e.what() << " 错误码: " << e.code() << std::endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值