#c #regex #string #parsing #stringstream
#c #регулярное выражение #строка #синтаксический анализ #stringstream
Вопрос:
Я уже некоторое время бьюсь головой об стену из-за этого. То, что я пытаюсь сделать, это прочитать строку ввода, извлечь из нее целые числа и сохранить это для последующего использования.
Пример входных данных:
subi r23, R10, 435
Lb r3, -3(r10)
Пример результатов:
Что касается строки ‘subi’, мне понадобились бы 3 переменные rs1 = 23, rs2 = 10 и imm = 435. Для Lb мне понадобились бы rs1 = 3, rs2 = 10 и imm = -3.
Существует много разных типов входных данных и способа их написания, поэтому я ищу наиболее общий метод. Я думал, что регулярное выражение было ответом, но лично я ничего не мог заставить работать, и, возможно, это мое невежество в отношении регулярных выражений. Когда я говорю, что у меня ничего не получилось, я имею в виду это, я, честно говоря, не мог опубликовать то, что я пытался здесь, потому что я почти уверен, что я просто придумывал. В настоящее время я использую эту идею:
for(int i = 0; line[i] != ''; i ){
if(isdigit(line[i]) != 0){
temp = line[i];
}
}
rs1tmp = temp[1];
rs1 = stoi(rs1tmp);
rs2tmp = temp[2];
rs2 = stoi(rs2tmp);
rdtmp = temp[0];
rd = stoi(rdtmp);
Проблема с этой идеей заключается в том, что она может получить мне только каждую цифру из строки. Это не работает с двузначными или отрицательными числами. Я думал о вложении некоторых операторов if, чтобы проверять значения рядом с цифрой. Итак, как только цифра найдена, я могу посмотреть налево и проверить, является ли это «-«, и посмотреть направо и проверить, является ли это цифрой. Затем возьмите решение этих if и перенесите его в вектор.
Хотя я думаю, что моя идея может сработать, я действительно надеюсь, что есть способ получше.
Спасибо всем!
Комментарии:
1. Это похоже на язык компьютерного программирования (в частности, на некоторую форму ассемблера). Такие значения всегда анализируются с помощью токенизации, никогда путем случайного извлечения числовых данных из каждой строки. Попробуйте, например, Boost Tokenizer, Boost Qi / Spirit или сгенерировать синтаксический анализатор с помощью yacc или bison, а не regex.
2. Вы, сэр, Бог. Спасибо. Использовал Boost Tokenizer, и менее чем за 20 минут у меня есть то, что мне нужно. Спасибо.
3. Это мой первый пост. Я не уверен, как пометить как «Решаемый», также я должен опубликовать решение, которое я использовал?
4. Вам абсолютно разрешено публиковать существенную часть вашего решения в качестве ответа. Платформа Stack Exchange устанавливает временную задержку, но в конечном итоге вы сможете установить зеленую галочку, которая переведет ваш вопрос в «решаемый».
Ответ №1:
Итак, используя boost:: tokenizer, я придумал эту функцию, и она отлично работает. Оно захватывает все положительные или отрицательные числа и сохраняет их в вектор для моего последующего использования:
vector<string> getNumbers(string s){
vector<string> resu<
typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
s=s.substr(s.find_first_of(" t") 1);
boost::char_separator<char> sep{" ,rR()"};
tokenizer tok{s, sep};
for (auto it = tok.begin(); it != tok.end(); it)
result.push_back(*it);
return resu<
}