2013-06-19 6 views
2

Может ли кто-нибудь дать мне несколько советов о том, какой лучший/элегантный подход для извлечения имени параметра и значения параметра из строки ввода переменной длины? Мне нужно извлечь эти значения, чтобы записать их в другой .txt-файл. Должен ли я использовать регулярное выражение? Каким будет их использование?Синтаксическая строка: # parameter1 ~ value1 # parameter2 ~ value2 # parameter3

Я знаю, как это сделать, но использую для циклов и различных условий if-then, и это беспорядок. Мне нужно, чтобы найти некоторые встроенные функции, которые могут мне помочь.

Спасибо!

+0

использовать два сплит с # и один с ~ по каждому результату –

ответ

1

Регулярное выражение в этом случае лишние накладные расходы. Для выполнения этой работы достаточно одного символа std::string::find. Предположим, что каждый параметр (даже первый) начинается с #, значение не является обязательным (по умолчанию "") и задний # всегда опущена вы можете сделать что-то как:

std::string pstr = ...; // the parameter string 

typedef std::pair<std::string, std::string> Param; 
std::vector<Param> params; 

std::size_t pos = pstr.find('#'); 
std::size_t next = pstr.find('#', pos); 

while (pos != std::string::npos) { 
    std::string param, value; 

    std::size_t sep_pos = pstr.find('~', next); 
    if (sep_pos != std::string::npos) { 
     value = pstr.substr(sep_pos + 1, next - sep_pos - 1); 
     param = pstr.substr(pos + 1, sep_pos - pos - 1); 
    } else { 
     param = pstr.substr(pos + 1, next - pos - 1); 
    } 
    params.push_back(Param(param, value)); 
} 

Обратите внимание, что std::strtok плохое предложение. Эта функция небезопасна и никогда не должна использоваться в нормальном коде на C++.

+0

@ jons34yp .. Можете ли вы рассказать о том, почему мы не можем использовать 'strtok' ... – nitish712

+0

Спасибо jons34yp за ваш ответ. Это действительно помогло мне решить мою проблему. Ура! – Krcevina

+0

@ nitish712: он не является реентерабельным (т. Е. Не используется в многопоточных программах) и изменяет заданную строку (то есть не может использоваться с данными, имеющими const). –

0

Предполагая, что исходный текст хранящийся выглядит следующим образом:

param1:value1;param2:value2;param3:value3..... 

Лучший способ заключается в использовании StringTokenizer из java. Код выглядит следующим образом:

StringTokenizer sT=new StringTokenizer(InputString, ";"); 
while(sT.hasMoreTokens()) 
{ 
    String Pair=sT.nextToken(); 
    String sT2=new StringTokenizer(Pair, ":"); 
    String param=sT2.nextToken(); 
    String value=sT2.nextToken(); 
    System.out.println(param+" "+value); 
} 

С другой стороны, если вы хотите кодировать строго в C++, то вы можете использовать C++ встречную часть, strtok функции. Для получения дополнительной информации см. here

Смежные вопросы