您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

91 行
2.8KB

  1. #pragma once
  2. #include <algorithm>
  3. #include <string>
  4. #include <string_view>
  5. #include <vector>
  6. namespace dds {
  7. inline namespace string_utils {
  8. inline std::string_view sview(std::string_view::const_iterator beg,
  9. std::string_view::const_iterator end) {
  10. if (beg == end) {
  11. return "";
  12. }
  13. return std::string_view(&*beg, static_cast<std::size_t>(std::distance(beg, end)));
  14. }
  15. inline std::string_view trim_view(std::string_view s) {
  16. auto iter = s.begin();
  17. auto end = s.end();
  18. while (iter != end && std::isspace(*iter)) {
  19. ++iter;
  20. }
  21. auto riter = s.rbegin();
  22. auto rend = std::make_reverse_iterator(iter);
  23. while (riter != rend && std::isspace(*riter)) {
  24. ++riter;
  25. }
  26. auto new_end = riter.base();
  27. return sview(iter, new_end);
  28. }
  29. inline bool ends_with(std::string_view s, std::string_view key) {
  30. auto found = s.rfind(key);
  31. return found != s.npos && found == s.size() - key.size();
  32. }
  33. inline bool starts_with(std::string_view s, std::string_view key) { return s.find(key) == 0; }
  34. inline bool contains(std::string_view s, std::string_view key) { return s.find(key) != s.npos; }
  35. inline std::vector<std::string_view> split_view(std::string_view str, std::string_view sep) {
  36. std::vector<std::string_view> ret;
  37. std::string_view::size_type prev_pos = 0;
  38. auto pos = prev_pos;
  39. while ((pos = str.find(sep, prev_pos)) != str.npos) {
  40. ret.emplace_back(str.substr(prev_pos, pos - prev_pos));
  41. prev_pos = pos + sep.length();
  42. }
  43. ret.emplace_back(str.substr(prev_pos));
  44. return ret;
  45. }
  46. inline std::vector<std::string> split(std::string_view str, std::string_view sep) {
  47. std::vector<std::string> ret;
  48. std::string_view::size_type prev_pos = 0;
  49. auto pos = prev_pos;
  50. while ((pos = str.find(sep, prev_pos)) != str.npos) {
  51. ret.emplace_back(str.substr(prev_pos, pos - prev_pos));
  52. prev_pos = pos + sep.length();
  53. }
  54. ret.emplace_back(str.substr(prev_pos));
  55. return ret;
  56. }
  57. inline std::string replace(std::string_view str, std::string_view key, std::string_view repl) {
  58. std::string ret;
  59. std::string_view::size_type pos = 0;
  60. std::string_view::size_type prev_pos = 0;
  61. while (pos = str.find(key, pos), pos != key.npos) {
  62. ret.append(str.begin() + prev_pos, str.begin() + pos);
  63. ret.append(repl);
  64. prev_pos = pos += key.size();
  65. }
  66. ret.append(str.begin() + prev_pos, str.end());
  67. return ret;
  68. }
  69. inline std::vector<std::string>
  70. replace(std::vector<std::string> strings, std::string_view key, std::string_view repl) {
  71. for (auto& item : strings) {
  72. item = replace(item, key, repl);
  73. }
  74. return strings;
  75. }
  76. } // namespace string_utils
  77. } // namespace dds