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