Извлекать /- целые числа из строки в c

#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<
  

}