C++11 std::regex_replace 使用 clang 3.5.0 和 libstdc++ 4.8.2 的行为
C++11 std::regex_replace behavior using clang 3.5.0 and libstdc++ 4.8.2
我一直在尝试理解使用 std::regex_replace 时以下简单正则表达式命令的行为。我正在尝试从 linux 系统上的完整路径中提取文件名。
std::string fullPath = "/folder/subfolder/fname.xyz";
std::string fname = std::regex_replace( fullPath, std::regex( std::string(".*/")), std::string(""));
其中 fname 变为空字符串。这是 std::regex_replace 的预期行为吗?我本来希望 fname 在调用后是 "fname.xyz"。
更新
我在 Ubuntu 14.04 上使用编译器标志编译程序:
CXX = clang++ WFLAGS=-Wall -Wno-deprecated-declarations -Wno-unknown-pragmas CXXFLAGS = $(WFLAGS) -Werror -g -std=c++11 -pthread
libstdc++内部abi版本为3.4.19。提取使用:
readelf -sV /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1
Ubuntu 14.04 (trusty) 的 libstdc++ 版本是 4.8.2。
您正在使用 4.9.0 之前的 libstdc++ 进行编译。此版本的 c++ 标准库未正确实现 <regex>
.
唯一真正的解决方案是升级您正在编译的 libstdc++
版本。
Would you like to know more?
我一直在尝试理解使用 std::regex_replace 时以下简单正则表达式命令的行为。我正在尝试从 linux 系统上的完整路径中提取文件名。
std::string fullPath = "/folder/subfolder/fname.xyz";
std::string fname = std::regex_replace( fullPath, std::regex( std::string(".*/")), std::string(""));
其中 fname 变为空字符串。这是 std::regex_replace 的预期行为吗?我本来希望 fname 在调用后是 "fname.xyz"。
更新
我在 Ubuntu 14.04 上使用编译器标志编译程序:
CXX = clang++ WFLAGS=-Wall -Wno-deprecated-declarations -Wno-unknown-pragmas CXXFLAGS = $(WFLAGS) -Werror -g -std=c++11 -pthread
libstdc++内部abi版本为3.4.19。提取使用:
readelf -sV /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1
Ubuntu 14.04 (trusty) 的 libstdc++ 版本是 4.8.2。
您正在使用 4.9.0 之前的 libstdc++ 进行编译。此版本的 c++ 标准库未正确实现 <regex>
.
唯一真正的解决方案是升级您正在编译的 libstdc++
版本。
Would you like to know more?