#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";
}
}
Вот живой пример.