fork download
  1.  
  2. #include <string>
  3. #include <vector>
  4. #include <iostream>
  5. #include <stdlib.h>
  6. class StringUtilities {
  7. public:
  8. typedef std::vector<std::string> Strings;
  9. static std::string GetEnvVariable(const std::string& var) {
  10. std::string ret;
  11. #ifdef WIN32
  12. char *pValue = NULL;
  13. size_t len;
  14. errno_t err = _dupenv_s(&pValue, &len, var.c_str());
  15. if (!pValue || err) {
  16. return ret;
  17. }
  18. ret = pValue;
  19. free(pValue);
  20. #else
  21. const char* pValue = getenv(var.c_str());
  22. if (pValue) {
  23. ret = pValue;
  24. }
  25. #endif
  26. return ret;
  27. }
  28. static std::string ExpandEnviornmentVariable(const std::string& s) {
  29. std::size_t start = s.find("${");
  30. std::size_t lastEnd = 0;
  31. std::string ret;
  32. while (start != std::string::npos) {
  33. std::size_t end = s.find("}", start + 2);
  34. if (end == std::string::npos) {
  35. break;
  36. }
  37. ret.append(s.substr(lastEnd, start - lastEnd));
  38. ret.append(GetEnvVariable(s.substr(start + 2, end - start - 2)));
  39. lastEnd = end + 1;
  40. start = s.find("${", lastEnd);
  41. }
  42. ret.append(s.substr(lastEnd));
  43. return ret;
  44. }
  45. static Strings Split(const std::string& str, const std::string& delim, bool bCompress = true) {
  46. std::size_t start = 0;
  47. std::size_t found = str.find_first_of(delim, start);
  48. Strings ret;
  49. while (found != std::string::npos) {
  50. if (start < found || bCompress == false) {
  51. ret.push_back(str.substr(start, found - start));
  52. }
  53. start = found + 1;
  54. found = str.find_first_of(delim, start);
  55. }
  56. std::string ins(str.begin() + start, str.end());
  57. if (start < str.length()) {
  58. ret.push_back(str.substr(start));
  59. }
  60. return ret;
  61. }
  62. static std::string Replace(const std::string& str, const std::string& from, const std::string to, int occurence = 0, bool every = false) {
  63. typedef std::string::size_type(std::string::*pFind)(const std::string& str, std::string::size_type pos) const;
  64. pFind find = &std::string::find;
  65. std::size_t start = 0;
  66. int inc = 1, count = 0;
  67. std::string ret = str;
  68. if (occurence < 0)
  69. {
  70. find = &std::string::rfind;
  71. start = str.length();
  72. inc = -1;
  73. occurence *= -1;
  74. }
  75. std::size_t found = ((ret).*(find))(from, start);
  76. while (found != std::string::npos)
  77. {
  78. count++;
  79. if (count == occurence || occurence == 0)
  80. {
  81. ret.replace(found, from.length(), to);
  82. if (occurence != 0 && !every) {
  83. return ret;
  84. }
  85. else if (every) {
  86. count = 0;
  87. std::cout << "count = " << count << std::endl;
  88. }
  89. }
  90. std::cout << "Replacing count = " << count << " start = " << start << " foudn =" << found << std::endl;
  91. start = found + (from.length()*inc);
  92. found = ((ret).*(find))(from, start);
  93. }
  94. return ret;
  95. }
  96. };
  97. int main() {
  98. StringUtilities::Strings test;
  99. std::string str;
  100. str = "|Abcd|${test}:blah|||${path}|bbb|sdf|${pathext}|${TEMP}";
  101. std::cout << "=======" << str << std::endl;
  102. str = StringUtilities::ExpandEnviornmentVariable(str);
  103. std::cout << "=======" << str << std::endl;
  104. test = StringUtilities::Split(str, ";|");
  105. for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
  106. std::cout << *it << std::endl;
  107. }
  108. str = "test";
  109. test = StringUtilities::Split(str, ";");
  110. std::cout << "=======" << str << std::endl;
  111. for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
  112. std::cout << *it << std::endl;
  113. }
  114. str = "";
  115. test = StringUtilities::Split(str, ";");
  116. std::cout << "=======" << str << std::endl;
  117. for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
  118. std::cout << *it << std::endl;
  119. }
  120. str = ":::;;;;;:::::";
  121. test = StringUtilities::Split(str, ";");
  122. std::cout << "=======" << str << std::endl;
  123. for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
  124. std::cout << *it << std::endl;
  125. }
  126. str = "test;;;;";
  127. test = StringUtilities::Split(str, ";");
  128. std::cout << "=======" << str << std::endl;
  129. for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
  130. std::cout << *it << std::endl;
  131. }
  132.  
  133. str = "|Abcd|${test}:blah|||${test}|bbb|sdf|${test}|${test}";
  134. std::cout << "=======" << StringUtilities::Replace(str, "dddd", "") << std::endl;
  135. std::cout << "ReplaceALL " << StringUtilities::Replace(str, "${test}", "Sanjay") << std::endl;
  136. std::cout << "StringUtilities::Replace 1 " << StringUtilities::Replace(str, "${test}", "Sanjay", 1) << std::endl;
  137. std::cout << "StringUtilities::Replace 2 " << StringUtilities::Replace(str, "${test}", "Sanjay", 2) << std::endl;
  138. std::cout << "StringUtilities::Replace 3 " << StringUtilities::Replace(str, "${test}", "Sanjay", 3) << std::endl;
  139. std::cout << "StringUtilities::Replace 4 " << StringUtilities::Replace(str, "${test}", "Sanjay", 4) << std::endl;
  140. std::cout << "StringUtilities::Replace -1 " << StringUtilities::Replace(str, "${test}", "Sanjay", -1) << std::endl;
  141. std::cout << "StringUtilities::Replace -2 " << StringUtilities::Replace(str, "${test}", "Sanjay", -2) << std::endl;
  142. std::cout << "StringUtilities::Replace -3 " << StringUtilities::Replace(str, "${test}", "Sanjay", -3) << std::endl;
  143. std::cout << "StringUtilities::Replace -4 " << StringUtilities::Replace(str, "${test}", "Sanjay", -4) << std::endl;
  144.  
  145. std::cout << "StringUtilities::Replace 1 " << StringUtilities::Replace(str, "${test}", "Sanjay", 1, true) << std::endl;
  146. std::cout << "StringUtilities::Replace 2 " << StringUtilities::Replace(str, "${test}", "Sanjay", 2, true) << std::endl;
  147. std::cout << "StringUtilities::Replace 3 " << StringUtilities::Replace(str, "${test}", "Sanjay", 3, true) << std::endl;
  148. std::cout << "StringUtilities::Replace 4 " << StringUtilities::Replace(str, "${test}", "Sanjay", 4, true) << std::endl;
  149. std::cout << "StringUtilities::Replace -1 " << StringUtilities::Replace(str, "${test}", "Sanjay", -1, true) << std::endl;
  150. std::cout << "StringUtilities::Replace -2 " << StringUtilities::Replace(str, "${test}", "Sanjay", -2, true) << std::endl;
  151. std::cout << "StringUtilities::Replace -3 " << StringUtilities::Replace(str, "${test}", "Sanjay", -3, true) << std::endl;
  152. std::cout << "StringUtilities::Replace -4 " << StringUtilities::Replace(str, "${test}", "Sanjay", -4, true) << std::endl;
  153. }
  154.  
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
=======|Abcd|${test}:blah|||${path}|bbb|sdf|${pathext}|${TEMP}
=======|Abcd|:blah||||bbb|sdf||
Abcd
:blah
bbb
sdf
=======test
test
=======
=======:::;;;;;:::::
:::
:::::
=======test;;;;
test
=======|Abcd|${test}:blah|||${test}|bbb|sdf|${test}|${test}
Replacing count = 1 start = 0 foudn =6
Replacing count = 2 start = 13 foudn =20
Replacing count = 3 start = 27 foudn =35
Replacing count = 4 start = 42 foudn =42
ReplaceALL |Abcd|Sanjay:blah|||Sanjay|bbb|sdf|Sanjay|Sanjay
StringUtilities::Replace 1 |Abcd|Sanjay:blah|||${test}|bbb|sdf|${test}|${test}
Replacing count = 1 start = 0 foudn =6
StringUtilities::Replace 2 |Abcd|${test}:blah|||Sanjay|bbb|sdf|${test}|${test}
Replacing count = 1 start = 0 foudn =6
Replacing count = 2 start = 13 foudn =21
StringUtilities::Replace 3 |Abcd|${test}:blah|||${test}|bbb|sdf|Sanjay|${test}
Replacing count = 1 start = 0 foudn =6
Replacing count = 2 start = 13 foudn =21
Replacing count = 3 start = 28 foudn =37
StringUtilities::Replace 4 |Abcd|${test}:blah|||${test}|bbb|sdf|${test}|Sanjay
StringUtilities::Replace -1 |Abcd|${test}:blah|||${test}|bbb|sdf|${test}|Sanjay
Replacing count = 1 start = 52 foudn =45
StringUtilities::Replace -2 |Abcd|${test}:blah|||${test}|bbb|sdf|Sanjay|${test}
Replacing count = 1 start = 52 foudn =45
Replacing count = 2 start = 38 foudn =37
StringUtilities::Replace -3 |Abcd|${test}:blah|||Sanjay|bbb|sdf|${test}|${test}
Replacing count = 1 start = 52 foudn =45
Replacing count = 2 start = 38 foudn =37
Replacing count = 3 start = 30 foudn =21
StringUtilities::Replace -4 |Abcd|Sanjay:blah|||${test}|bbb|sdf|${test}|${test}
count = 0
Replacing count = 0 start = 0 foudn =6
count = 0
Replacing count = 0 start = 13 foudn =20
count = 0
Replacing count = 0 start = 27 foudn =35
count = 0
Replacing count = 0 start = 42 foudn =42
StringUtilities::Replace 1 |Abcd|Sanjay:blah|||Sanjay|bbb|sdf|Sanjay|Sanjay
Replacing count = 1 start = 0 foudn =6
count = 0
Replacing count = 0 start = 13 foudn =21
Replacing count = 1 start = 28 foudn =36
count = 0
Replacing count = 0 start = 43 foudn =44
StringUtilities::Replace 2 |Abcd|${test}:blah|||Sanjay|bbb|sdf|${test}|Sanjay
Replacing count = 1 start = 0 foudn =6
Replacing count = 2 start = 13 foudn =21
count = 0
Replacing count = 0 start = 28 foudn =37
Replacing count = 1 start = 44 foudn =44
StringUtilities::Replace 3 |Abcd|${test}:blah|||${test}|bbb|sdf|Sanjay|${test}
Replacing count = 1 start = 0 foudn =6
Replacing count = 2 start = 13 foudn =21
Replacing count = 3 start = 28 foudn =37
count = 0
Replacing count = 0 start = 44 foudn =45
StringUtilities::Replace 4 |Abcd|${test}:blah|||${test}|bbb|sdf|${test}|Sanjay
count = 0
Replacing count = 0 start = 52 foudn =45
count = 0
Replacing count = 0 start = 38 foudn =37
count = 0
Replacing count = 0 start = 30 foudn =21
count = 0
Replacing count = 0 start = 14 foudn =6
StringUtilities::Replace -1 |Abcd|Sanjay:blah|||Sanjay|bbb|sdf|Sanjay|Sanjay
Replacing count = 1 start = 52 foudn =45
count = 0
Replacing count = 0 start = 38 foudn =37
Replacing count = 1 start = 30 foudn =21
count = 0
Replacing count = 0 start = 14 foudn =6
Replacing count = 1 start = 4294967295 foudn =43
count = 0
Replacing count = 0 start = 36 foudn =20
StringUtilities::Replace -2 |Abcd|Sanjay:blah|||Sanjay|bbb|sdf|Sanjay|${test}
Replacing count = 1 start = 52 foudn =45
Replacing count = 2 start = 38 foudn =37
count = 0
Replacing count = 0 start = 30 foudn =21
Replacing count = 1 start = 14 foudn =6
Replacing count = 2 start = 4294967295 foudn =44
count = 0
Replacing count = 0 start = 37 foudn =36
Replacing count = 1 start = 29 foudn =6
Replacing count = 2 start = 4294967295 foudn =43
count = 0
Replacing count = 0 start = 36 foudn =6
Replacing count = 1 start = 4294967295 foudn =42
StringUtilities::Replace -3 |Abcd|Sanjay:blah|||Sanjay|bbb|sdf|Sanjay|${test}
Replacing count = 1 start = 52 foudn =45
Replacing count = 2 start = 38 foudn =37
Replacing count = 3 start = 30 foudn =21
count = 0
Replacing count = 0 start = 14 foudn =6
Replacing count = 1 start = 4294967295 foudn =44
Replacing count = 2 start = 37 foudn =36
Replacing count = 3 start = 29 foudn =20
StringUtilities::Replace -4 |Abcd|Sanjay:blah|||${test}|bbb|sdf|${test}|${test}