1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_STRINGS_STRING_SPLIT_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_STRINGS_STRING_SPLIT_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker #include <utility> 10*6777b538SAndroid Build Coastguard Worker #include <vector> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h" 14*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace base { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker enum WhitespaceHandling { 19*6777b538SAndroid Build Coastguard Worker KEEP_WHITESPACE, 20*6777b538SAndroid Build Coastguard Worker TRIM_WHITESPACE, 21*6777b538SAndroid Build Coastguard Worker }; 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker enum SplitResult { 24*6777b538SAndroid Build Coastguard Worker // Strictly return all results. 25*6777b538SAndroid Build Coastguard Worker // 26*6777b538SAndroid Build Coastguard Worker // If the input is ",," and the separator is ',' this will return a 27*6777b538SAndroid Build Coastguard Worker // vector of three empty strings. 28*6777b538SAndroid Build Coastguard Worker SPLIT_WANT_ALL, 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker // Only nonempty results will be added to the results. Multiple separators 31*6777b538SAndroid Build Coastguard Worker // will be coalesced. Separators at the beginning and end of the input will 32*6777b538SAndroid Build Coastguard Worker // be ignored. With TRIM_WHITESPACE, whitespace-only results will be dropped. 33*6777b538SAndroid Build Coastguard Worker // 34*6777b538SAndroid Build Coastguard Worker // If the input is ",," and the separator is ',', this will return an empty 35*6777b538SAndroid Build Coastguard Worker // vector. 36*6777b538SAndroid Build Coastguard Worker SPLIT_WANT_NONEMPTY, 37*6777b538SAndroid Build Coastguard Worker }; 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker // Split the given string on ANY of the given separators, returning copies of 40*6777b538SAndroid Build Coastguard Worker // the result. 41*6777b538SAndroid Build Coastguard Worker // 42*6777b538SAndroid Build Coastguard Worker // Note this is inverse of JoinString() defined in string_util.h. 43*6777b538SAndroid Build Coastguard Worker // 44*6777b538SAndroid Build Coastguard Worker // To split on either commas or semicolons, keeping all whitespace: 45*6777b538SAndroid Build Coastguard Worker // 46*6777b538SAndroid Build Coastguard Worker // std::vector<std::string> tokens = base::SplitString( 47*6777b538SAndroid Build Coastguard Worker // input, ",;", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); 48*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::vector<std::string> SplitString( 49*6777b538SAndroid Build Coastguard Worker StringPiece input, 50*6777b538SAndroid Build Coastguard Worker StringPiece separators, 51*6777b538SAndroid Build Coastguard Worker WhitespaceHandling whitespace, 52*6777b538SAndroid Build Coastguard Worker SplitResult result_type); 53*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::vector<std::u16string> SplitString( 54*6777b538SAndroid Build Coastguard Worker StringPiece16 input, 55*6777b538SAndroid Build Coastguard Worker StringPiece16 separators, 56*6777b538SAndroid Build Coastguard Worker WhitespaceHandling whitespace, 57*6777b538SAndroid Build Coastguard Worker SplitResult result_type); 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // Like SplitString above except it returns a vector of StringPieces which 60*6777b538SAndroid Build Coastguard Worker // reference the original buffer without copying. Although you have to be 61*6777b538SAndroid Build Coastguard Worker // careful to keep the original string unmodified, this provides an efficient 62*6777b538SAndroid Build Coastguard Worker // way to iterate through tokens in a string. 63*6777b538SAndroid Build Coastguard Worker // 64*6777b538SAndroid Build Coastguard Worker // Note this is inverse of JoinString() defined in string_util.h. 65*6777b538SAndroid Build Coastguard Worker // 66*6777b538SAndroid Build Coastguard Worker // To iterate through all whitespace-separated tokens in an input string: 67*6777b538SAndroid Build Coastguard Worker // 68*6777b538SAndroid Build Coastguard Worker // for (const auto& cur : 69*6777b538SAndroid Build Coastguard Worker // base::SplitStringPiece(input, base::kWhitespaceASCII, 70*6777b538SAndroid Build Coastguard Worker // base::KEEP_WHITESPACE, 71*6777b538SAndroid Build Coastguard Worker // base::SPLIT_WANT_NONEMPTY)) { 72*6777b538SAndroid Build Coastguard Worker // ... 73*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::vector<StringPiece> SplitStringPiece( 74*6777b538SAndroid Build Coastguard Worker StringPiece input, 75*6777b538SAndroid Build Coastguard Worker StringPiece separators, 76*6777b538SAndroid Build Coastguard Worker WhitespaceHandling whitespace, 77*6777b538SAndroid Build Coastguard Worker SplitResult result_type); 78*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::vector<StringPiece16> SplitStringPiece( 79*6777b538SAndroid Build Coastguard Worker StringPiece16 input, 80*6777b538SAndroid Build Coastguard Worker StringPiece16 separators, 81*6777b538SAndroid Build Coastguard Worker WhitespaceHandling whitespace, 82*6777b538SAndroid Build Coastguard Worker SplitResult result_type); 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker using StringPairs = std::vector<std::pair<std::string, std::string>>; 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker // Splits |line| into key value pairs according to the given delimiters and 87*6777b538SAndroid Build Coastguard Worker // removes whitespace leading each key and trailing each value. Returns true 88*6777b538SAndroid Build Coastguard Worker // only if each pair has a non-empty key and value. |key_value_pairs| will 89*6777b538SAndroid Build Coastguard Worker // include ("","") pairs for entries without |key_value_delimiter|. 90*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool SplitStringIntoKeyValuePairs(StringPiece input, 91*6777b538SAndroid Build Coastguard Worker char key_value_delimiter, 92*6777b538SAndroid Build Coastguard Worker char key_value_pair_delimiter, 93*6777b538SAndroid Build Coastguard Worker StringPairs* key_value_pairs); 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker // Similar to SplitStringIntoKeyValuePairs, but use a substring 96*6777b538SAndroid Build Coastguard Worker // |key_value_pair_delimiter| instead of a single char. 97*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool SplitStringIntoKeyValuePairsUsingSubstr( 98*6777b538SAndroid Build Coastguard Worker StringPiece input, 99*6777b538SAndroid Build Coastguard Worker char key_value_delimiter, 100*6777b538SAndroid Build Coastguard Worker StringPiece key_value_pair_delimiter, 101*6777b538SAndroid Build Coastguard Worker StringPairs* key_value_pairs); 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // Similar to SplitString, but use a substring delimiter instead of a list of 104*6777b538SAndroid Build Coastguard Worker // characters that are all possible delimiters. 105*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::vector<std::u16string> SplitStringUsingSubstr( 106*6777b538SAndroid Build Coastguard Worker StringPiece16 input, 107*6777b538SAndroid Build Coastguard Worker StringPiece16 delimiter, 108*6777b538SAndroid Build Coastguard Worker WhitespaceHandling whitespace, 109*6777b538SAndroid Build Coastguard Worker SplitResult result_type); 110*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::vector<std::string> SplitStringUsingSubstr( 111*6777b538SAndroid Build Coastguard Worker StringPiece input, 112*6777b538SAndroid Build Coastguard Worker StringPiece delimiter, 113*6777b538SAndroid Build Coastguard Worker WhitespaceHandling whitespace, 114*6777b538SAndroid Build Coastguard Worker SplitResult result_type); 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker // Like SplitStringUsingSubstr above except it returns a vector of StringPieces 117*6777b538SAndroid Build Coastguard Worker // which reference the original buffer without copying. Although you have to be 118*6777b538SAndroid Build Coastguard Worker // careful to keep the original string unmodified, this provides an efficient 119*6777b538SAndroid Build Coastguard Worker // way to iterate through tokens in a string. 120*6777b538SAndroid Build Coastguard Worker // 121*6777b538SAndroid Build Coastguard Worker // To iterate through all newline-separated tokens in an input string: 122*6777b538SAndroid Build Coastguard Worker // 123*6777b538SAndroid Build Coastguard Worker // for (const auto& cur : 124*6777b538SAndroid Build Coastguard Worker // base::SplitStringUsingSubstr(input, "\r\n", 125*6777b538SAndroid Build Coastguard Worker // base::KEEP_WHITESPACE, 126*6777b538SAndroid Build Coastguard Worker // base::SPLIT_WANT_NONEMPTY)) { 127*6777b538SAndroid Build Coastguard Worker // ... 128*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::vector<StringPiece16> 129*6777b538SAndroid Build Coastguard Worker SplitStringPieceUsingSubstr(StringPiece16 input, 130*6777b538SAndroid Build Coastguard Worker StringPiece16 delimiter, 131*6777b538SAndroid Build Coastguard Worker WhitespaceHandling whitespace, 132*6777b538SAndroid Build Coastguard Worker SplitResult result_type); 133*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::vector<StringPiece> SplitStringPieceUsingSubstr( 134*6777b538SAndroid Build Coastguard Worker StringPiece input, 135*6777b538SAndroid Build Coastguard Worker StringPiece delimiter, 136*6777b538SAndroid Build Coastguard Worker WhitespaceHandling whitespace, 137*6777b538SAndroid Build Coastguard Worker SplitResult result_type); 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker } // namespace base 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 142*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split_win.h" 143*6777b538SAndroid Build Coastguard Worker #endif 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker #endif // BASE_STRINGS_STRING_SPLIT_H_ 146