@rusianvodka

Регулярные выражения, Поиск всех видов чисел в строке, CString

Здравствуйте Уважаемые Дамы и Господа.
Уже какой вечер мучаюсь, пытаюсь понять как решить поставленную задачу.
Имеется строчка:
CString str = "	int z, a=245;int b = 4.6;int b = 0xa11;int c = 011; for(int a = 1;i<123; i++) ";a=437-(-0xab24)"

Задача выдернуть из неё все числа.
С помощью:
str.FindOneOf(L"01234567890");
Получается найти число(любого вида, что очень важно).
Данной функцией я перевожу число из строкового типа в целочисленный.
swscanf_s(str, L"%i", &a);
Но если необходимо найти отрицательное число, возникают проблемы..
str.FindOneOf(L"-01234567890");
Находится первое вхождение символа без цифры.
Поэтому как я осознал, в решение поставленной задачи мне помогут регулярные выражения std regex(если это не так, буду рад вариантам иного решения данной задачи).
К сожалению в данной технологии я полный профан, поэтому хотел бы попросить помощи, совета по хорошим ресурсам, книгам, статьям где можно получить необходимые знания.
Если напишите шаблон решения поставленной задачи тоже буду примного благодарен, буду по нему понимать что как происходит.

Также задам вопрос наперёд, если решать поставленную задачу без знаков то всё облегчается и регулярные выражения не нужны.
Так как swscanf_s нужно передавать строчку где первые символы и есть необходимое число перевода.
А FindOneOf возвращает только номер от начала строки.
То возникает проблема, как передать адрес места, найденного числа в строке.

Данную проблему я решил с помощью очистки строчки до необходимого числа.(Если имеются другие варианты более простые или удобные также буду благодарен.)
Например:
CString str = "	int z, a=245;int b = 4.6;int b = 0xa11;int c = 011; for(int a = 1;i<123; i++) ";a=437-(-0xab24)"

После моего быдлокодинга, строка становится такой:
CString str = "	         245;int b = 4.6;int b = 0xa11;int c = 011; for(int a = 1;i<123; i++) ";a=437-(-0xab24)"

Дальше передавая str в swscanf_s число прекрасно распознаётся.
Но возникает другая проблема.
Как заставить FindOneOf перейти к поиску следующего числа 4.6.
Была идея убивать число 245 в строчке, но как это реализовать я даже не представляю.
Возможно меня всё также спасут регулярные выражения.
Надеюсь найдутся гуру регулярных выражений которые осилят данную простыню.
И я буду премного вам благодарен за советы и помощь.
  • Вопрос задан
  • 3942 просмотра
Пригласить эксперта
Ответы на вопрос 1
bogolt
@bogolt
1. Во всех адекватных функциях поиска учтена возможность начала поиска с определенной позиции.

2. Как ваш алгоритм выудит число 0xa11 ?

3. Не понимаю зачем тут нужны регулярные выражения. Все имхо можно вполне сделать простым алгоритмом:
Разбить на строки
Каждую строку разбить на отдельные слова ( делить по пробелам, знакам препинания ( исключая точку которая может быть разделителем дробных чисел ).
Проверить каждое слово на символы из которых оно состоит - это вы уже реализовали.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы