通过多个分隔符将字符串拆分为单词
我有一些文本(有意义的文本或算术表达式),我想将其拆分为单词。
如果我有一个分隔符,我会使用:
std::stringstream stringStream(inputString);
std::string word;
while(std::getline(stringStream, word, delimiter))
{
wordVector.push_back(word);
}
如何将字符串分解为带有多个分隔符的标记?
I have some text (meaningful text or arithmetical expression) and I want to split it into words.
If I had a single delimiter, I'd use:
std::stringstream stringStream(inputString);
std::string word;
while(std::getline(stringStream, word, delimiter))
{
wordVector.push_back(word);
}
How can I break the string into tokens with several delimiters?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
假设分隔符之一是换行符,则以下内容读取该行并进一步按分隔符分割它。在本示例中,我选择了分隔符空格、撇号和分号。
Assuming one of the delimiters is newline, the following reads the line and further splits it by the delimiters. For this example I've chosen the delimiters space, apostrophe, and semi-colon.
如果你有提升,你可以使用:
If you have boost, you could use:
使用
std::regex
std::regex
可以在几行中进行字符串分割:自己尝试一下
Using
std::regex
A
std::regex
can do string splitting in a few lines:Try it yourself
我不知道为什么没有人指出手动方式,但它是:
并且在功能上:
这样,如果您愿意,您可以使用 delims 做一些有用的事情。
I don't know why nobody pointed out the manual way, but here it is:
and in function:
This way you can do something useful with the delims if you want.
如果您对如何自己做而不是使用 boost 感兴趣。
假设分隔符字符串可能很长 - 假设为 M,检查字符串中的每个字符是否为分隔符,每个字符的成本为 O(M),因此在循环中对原始字符串中的所有字符执行此操作,假设长度为 N,是 O(M*N)。
我会使用字典(就像映射 - “分隔符”到“布尔值” - 但在这里我会使用一个简单的布尔数组,每个分隔符的 index = ascii 值都为 true)。
现在迭代字符串并检查 char 是否是分隔符,时间复杂度为 O(1),最终总体上为 O(N)。
这是我的示例代码:
注意:tokenizeMyString 按值返回向量并首先在堆栈上创建它,因此我们在这里使用编译器的功能>>> RVO - 返回值优化:)
If you interesting in how to do it yourself and not using boost.
Assuming the delimiter string may be very long - let say M, checking for every char in your string if it is a delimiter, would cost O(M) each, so doing so in a loop for all chars in your original string, let say in length N, is O(M*N).
I would use a dictionary (like a map - "delimiter" to "booleans" - but here I would use a simple boolean array that has true in index = ascii value for each delimiter).
Now iterating on the string and check if the char is a delimiter is O(1), which eventually gives us O(N) overall.
Here is my sample code:
Note: tokenizeMyString returns vector by value and create it on the stack first, so we're using here the power of the compiler >>> RVO - return value optimization :)
使用 Eric Niebler 的 range-v3 库:
https://godbolt.org/z/ZnxfSa
Using Eric Niebler's range-v3 library:
https://godbolt.org/z/ZnxfSa
多年以后,这里出现了使用 C++20 的解决方案:
必需的标头:
参考: https ://en.cppreference.com/w/cpp/ranges/split_view
And here, ages later, a solution using C++20:
Required headers:
Reference: https://en.cppreference.com/w/cpp/ranges/split_view