как можно извлечь имя из строки

#c

#c

Вопрос:

Предположим, что у меня есть строка из файла, которую я хочу прочитать:

 >NZ_FNBK01000055.1 Halorientalis regularis    
  

Итак, как можно извлечь имя из той строки, которая начинается со знака больше, чем; все, что следует за знаком больше, чем (и исключая новую строку в конце строки), является именем.
Имя должно быть:

 NZ_FNBK01000055.1 Halorientalis regularis
  

Вот мой код на данный момент:

 bool file::load(istreamamp; file)
{
string line;
while(getline(genomeSource, line)){
    if(line.find(">") != string::npos)
    {
        m_name = 
    }
}
return true;
}
  

Комментарии:

1. имя, которое я хочу, всегда после ‘>’. Как я могу получить имя без ‘>’? например, m_name = имя или cout<<имя?

2. Пришло время изучить замечательные возможности std::string . Обратите внимание, что эта штука вызывается substr , например.

3. Должен ли > быть в начале строки? Ваш код ищет a > в любом месте строки. Если вас интересует только a > в начале строки, то условие if должно быть line.find(">") == 0

Ответ №1:

Вы могли бы легко обработать оба условия, используя регулярные выражения. c появился <regex> в c 11. Используя это и регулярное выражение, подобное:

 >.*? (.*?) .*$
  
  • > Получаем буквенный символ
  • .*? Не жадный поиск чего-либо, заканчивающегося пробелом (.*?) Не жадный поиск чего-либо, заканчивающегося пробелом, но группирующий символы перед рукой.
  • .*$ Жадный поиск до конца строки.

С помощью этого вы можете легко проверить, соответствует ли эта строка вашим критериям, и одновременно получить имя. Вот тест, показывающий, что это работает. Для кода библиотека регулярных выражений c 11 очень проста:

 std::string s = ">NZ_FNBK01000055.1 Halorientalis regularis    "; 
std::regex rgx(">.*? (.*?) .*$"); // Make the regex
std::smatch matches;

if(std::regex_search(s, matches, rgx)) { // Do a search
    if (matches.size() > 1) { // If there are matches, print them.
        std::cout << "The name is " << matches[1].str() << "n"; 
    }
}
  

Вот живой пример.