【发布时间】:2016-08-13 02:04:56
【问题描述】:
我有一个难看的字符串,它由几个 URI 组成。
:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/0_301_0.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02011.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02012.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02110000.svg
我想要做的是去掉每个出现的字符:/.,,这样我就可以有一个字符串作为有效的文件名。
我写了这个简单的正则表达式就是为了做到这一点:[^(:/,.)]
根据http://www.regexpal.com/,这似乎是正确的正则表达式。
但是,当我运行以下 C++ 代码时,我没有得到我所期望的(只是字母数字字符和下划线),我只得到了序列中的第一个字母数字字符:S。
我在 std::regex 上做错了什么,或者我的 regex 表达式关闭了?
#include <iostream>
#include <regex>
#include <string>
static const std::string filenames {R"(:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/0_301_0.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02011.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02012.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02110000.svg)"};
static const std::regex filename_extractor("[^(:/,.)]");
int main() {
std::smatch filename_match;
if(std::regex_search(filenames, filename_match, filename_extractor))
{
std::cout << "Number of filenames: " << filename_match.size() << std::endl;
for(std::size_t i = 0; i < filename_match.size(); ++i)
{
std::cout << i << ": " << filename_match[i] << std::endl;
}
}
return 0;
}
【问题讨论】:
-
我怀疑你想要
std::regex_replace,但这可能最好不要使用正则表达式。也许看看std::remove_if。 -
我不明白。您的字符串包含
,:/,而不是:/,?你不能分开吗?