2012-11-15 17 views
6

अंदर बंटवारे के बिना विभाजन मैंस्प्लिट सी का उपयोग कर एक स्ट्रिंग ++ को बढ़ावा देने :: उद्धृत पाठ

boost::split(strs, r_strCommandLine, boost::is_any_of("\t ")); 

उपयोग कर रहा हूँ एक सरल स्क्रिप्ट पार्स करने के लिए टोकन में एक स्ट्रिंग थूकने की। अब तक सब ठीक है. हालांकि, निम्न स्ट्रिंग के लिए

command_name first_argument "Second argument which is a quoted string." 

मैं अपने टोकन की तरह,

strs[0] = command_name 
strs[1] = first_argument 
strs[2] = "Second argument which is a quoted string." 
बेशक

होने के लिए चाहते हैं कि मैंने शुरू में उद्धरण वर्ण के लिए खोज सकते हैं और टोकन के समाप्त होने और का उपयोग कर "" विलय टोकन सीमांकक उद्धरण के साथ शुरू होने वाले टोकन की घटना और उद्धृत स्ट्रिंग को फिर से बनाने के लिए उद्धरण के साथ समाप्त होने वाले टोकन की घटना के बीच, लेकिन मुझे आश्चर्य है कि ऐसा करने का एक अधिक कुशल/सुरुचिपूर्ण तरीका है या नहीं। कोई विचार?

+0

'\ "' s "से भी बच निकला है? – Yakk

+0

स्टैक ओवरफ़्लो में आपका स्वागत है! मैं आपके प्रश्न से उलझन में हूं। क्या इस प्रश्न का पहला अनुच्छेद किसी भी तरह से संबंधित प्रश्न के लिए संबंधित है? –

+2

[' boost :: tokenizer '] (http://www.boost.org/doc/libs/1_51_0/libs/tokenizer/introduc.htm) में आपके पास आवश्यक कार्यक्षमता हो सकती है। – hmjd

उत्तर

13

उदाहरण boost::tokenizer का उपयोग कर:

#include <string> 
#include <iostream> 
using std::cout; 
using std::string; 

#include <boost/tokenizer.hpp> 
using boost::tokenizer; 
using boost::escaped_list_separator; 

typedef tokenizer<escaped_list_separator<char> > so_tokenizer; 

int main() 
{ 
    string s("command_name first_argument " 
      "\"Second argument which is a quoted string.\""); 

    so_tokenizer tok(s, escaped_list_separator<char>('\\', ' ', '\"')); 
    for(so_tokenizer::iterator beg=tok.begin(); beg!=tok.end(); ++beg) 
    { 
     cout << *beg << "\n"; 
    } 

    return 0; 
} 

आउटपुट: https://ideone.com/gwCpug पर

 
command_name 
first_argument 
Second argument which is a quoted string. 

डेमो देखें।

+0

पूरी तरह से काम करती है। धन्यवाद! –

+0

उद्धरणों को संरक्षित करने का कोई तरीका है?मुझे आउटपुट की तरह होना चाहिए: 'command_name' ' first_argument' '" दूसरा तर्क जो उद्धृत स्ट्रिंग है। " –

0

मुझे यकीन नहीं है कि यह समाधान पोर्टेबल है (हम bool operator() (char ch) const के लिए कॉन्स्ट स्थिति का उल्लंघन करते हैं), लेकिन यह काम करता है।

यह समाधान सिद्धांत में दिलचस्प है, मैं इसे वास्तविक परियोजना में उपयोग नहीं करता।

#include <boost/algorithm/string/split.hpp> 
#include <string> 
#include <vector> 
#include <iostream> 

class split_q { 
public: 
    split_q() : in_q(false) {} 
    bool operator() (char ch) const 
    { 
     if (ch == '\"') in_q = !in_q; 
     return !in_q && ch == ' '; 
    } 

private: 
    mutable bool in_q; 

}; 

int main(int argc, char* argv[]) 
{ 
    std::string in = "command_name first_argument \"Second argument which is a quoted string.\" additional_argument"; 
    std::vector<std::string> res; 
    boost::algorithm::split(res, in, split_q()); 

    for (size_t i = 0; i < res.size(); ++i) 
     std::cout << res[i] << std::endl; 

    return 0; 
} 

परिणाम:

command_name 
first_argument 
"Second argument which is a quoted string." 
additional_argument 
+0

आप 'mutable'' in_q' के बजाय 'bool * in_q' संग्रहीत करके इसे 'const' को तोड़ सकते हैं। और एक बैकस्लैश एस्केप स्टेटस को जोड़ना आसान होना चाहिए। – Yakk

+0

मेरी चिंता म्यूटेबल कीवर्ड का उपयोग नहीं करना है, लेकिन अपरिवर्तनीयता का वास्तविक उल्लंघन – pogorskiy

+2

यदि आप मज़ेदार में एक सूचक संग्रहीत करते हैं तो अपरिवर्तनीयता का कोई उल्लंघन नहीं होता है। मज़ेदार को म्यूट करने के साथ बड़ी समस्या यह है कि आप अपने मज़ेदार के बिल्कुल एक उदाहरण का उपयोग करने के लिए एल्गोरिदम पर निर्भर करते हैं, और एक प्रतिलिपि नहीं बनाते - यदि ऐसा होता है, तो आप समस्याओं में भाग लेते हैं। पॉइंटर संस्करण के साथ मैं एकमात्र समस्या देख सकता हूं कि एल्गोरिदम इसे आउट-ऑफ-ऑर्डर चला सकता है। – Yakk

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^