我正在处理一个字符串并尝试在非字母数字(不是a-z,A-Z和0-9)时将其分解。我发现isalnum是一个有用的功能。
例如,如果我有字符串“bob-michael!#mi%@ pa hi3llary-tru1mp”
载体应包含:bob,michael,mi,pa,hi3llary和tru1mp。
我目前的代码是:
$item->returned_at = DEFAULT_VALUE;
我的想法是使用循环,而isalnum导致1继续前进,如果isalnum导致0然后将我到目前为止的任何内容推送到字符串向量中。也许我可以使用isalnum作为delim?我很难接受我的想法并写下这个。有人能指出我正确的方向吗?谢谢!
编辑:感谢大家的帮助。
答案 0 :(得分:4)
这些方面的一些东西,也许是:
std::vector<std::string> result;
std::string something = "bob-michael !#mi%@pa hi3llary-tru1mp";
std::regex token("[A-Za-z0-9]+");
std::copy(
std::sregex_token_iterator(something.begin(), something.end(), token),
std::sregex_token_iterator(),
std::back_inserter(result));
答案 1 :(得分:1)
你也可以遍历字符串然后检查当前索引是否是一个字母,然后如果不打破它然后存储到vector
std::string something = "bob-michael !#mi%@pa hi3llary-tru1mp";
std::vector<std::string> result;
std::string newResult = "";
for ( int a = 0; a < something.size(); a++ )
{
if((something[a] >= 'a' && something[a] <= 'z')||(something[a] >= 'A' && something[a] <= 'Z')
|| (something[a] >= '0' && something[a] <= '9'))
{
newResult += something[a];
}
else
{
if(newResult.size() > 0)
{
result.push_back(newResult);
newResult = "";
}
}
}
result.push_back(newResult);
答案 2 :(得分:1)
我评论过的std::replace_if
技巧原来并不像我想象的那么简单,因为std::isalnum
没有返回bool
。
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <sstream>
#include <iterator>
int main()
{
std::vector<std::string> result;
std::string something = "bob-michael !#mi%@pa hi3llary-tru1mp";
// I expected replace_if(something.begin(), something.end(), &isalnum, " ");
// would work, but then I did a bit of reading and found is alnum returned int,
// not bool. resolving this by wrapping isalnum in a lambda
std::replace_if(something.begin(),
something.end(),
[](char val)->bool {
return std::isalnum(val) == 0;
},
' ');
std::stringstream pie(something);
// read stream into vector
std::copy(std::istream_iterator<std::string>(pie),
std::istream_iterator<std::string>(),
std::back_inserter<std::vector<std::string>>(result));
// prove it works
for(const std::string & str: result)
{
std::cout << str << std::endl;
}
}