最近在写 YTL 中的字符串相关辅助函数。实现到 split
函数时,希望能够实现类似 Python 当中的 str.split
方法的功能。
If sep
is not specified or is None
, a different splitting algorithm is applied: runs of consecutive whitespace are regarded as a single separator, and the result will contain no empty strings at the start or end if the string has leading or trailing whitespace.
——https://docs.python.org/3/library/stdtypes.html#str.split
也就是说,在最基本的 split
的基础上,要添加两个功能:
- 删除输入字符串首尾的空白;
- 将字符串中的连续分隔符当成一个分隔符看待。
前一个功能很好实现。将空白符保存在 const char* trim_chars = " \t\n\r\v\f"
当中,然后使用 std::string::find_first_not_of
以及 std::string::find_last_not_of
即可找到有效内容的起止位置,最后再 std::string::erase
一下就好了。
后一个功能也不复杂。但要写得优雅——最好是能利用上标准库的设施——就不那么容易了。