Найдите и напечатайте число в скобках в C ++, используя Regex

Я использую этот код, чтобы найти число в скобках в C ++.

Я хочу, чтобы это число было извлечено из огромного файла, который содержит данные такого типа:

SUCCESSFUL CANDIDATES ARE INDICATED WITHIN PARANTHESIS AGAINST THEIR ROLL NUMBER AND THE EXTRA MARKS GIVEN [MAXIMUM FIVE MARKS] TO RAISE THEIR GRADES IN HARDSHIP CASES ARE INDICATED WITH PLUS[+] SIGN AND
GRACE MARKS CASES ARE INDICATED WITH CARET[+] SIGN600023[545]         600024[554]         600031[605]              600052[560]              ***********

Grade : D
Govt. Degree Boys College, Surjani Town600060[877]         ***********                   ***********                   ***********                   ***********

///// Во 2-й итерации, когда найдено [554]. m.size () не сбрасывается в ноль, что вызывает ошибку. Как я могу решить это? Как я ищу его глобально из всего файла числа в скобках [###]

#include <iostream>
#include <fstream>
#include <string>
#include<conio.h>
#include<regex>

using namespace std;

int main () {

ifstream myfile;

myfile.open("test.txt") ;if(!myfile)

{

cout<<"The file you entered is not present"<<endl;}string str;if(myfile.is_open())
cout<<"file is open";
else
cout<<"file is close";

string output;regex e("\[(\d+)\]");
smatch m;while (!myfile.eof()) {myfile >> str;
cout<<"O="<<str<<endl;

bool match=regex_search(str,m,e);

cout<<"m.size() ="<<m.size()<<endl;
int n=0;
for( n=0;n<m.size();n++)
{

cout<<"m["<<n<<"] :str() =" <<m[n].str()<<endl;

}}

getch();

myfile.close();
return 0;
}

Обновить:
Теперь я могу читать строку numbers.using.

Но мой файл достаточно большой, чтобы Visual Studio зависала.

Я хотел метод, который ищет глобально в файле.

1

Решение

Во-первых, вы должны исправить regex e("\[(\d+)\]") как regex e("\\[(\\d+)]") (или же regex e(R"(\[(\d+)])") если ваша среда C ++ поддерживает необработанные строковые литералы).

Затем вам нужно получить несколько Матчи, не только все захват группы содержимого что ты сейчас делаешь. Используйте std::sregex_iterator() и получить доступ к содержимому группы 1 через m[1].str(),

Увидеть это C ++ демо:

std::regex r("\\[(\\d+)]");
std::string s = "SUCCESSFUL CANDIDATES ARE INDICATED WITHIN PARANTHESIS AGAINST THEIR ROLL NUMBER AND THE EXTRA MARKS GIVEN [MAXIMUM FIVE MARKS] TO RAISE THEIR GRADES IN HARDSHIP CASES ARE INDICATED WITH PLUS[+] SIGN AND\nGRACE MARKS CASES ARE INDICATED WITH CARET[+] SIGN\n\n\n600023[545]         600024[554]         600031[605]              600052[560]              ***********\n\nGrade : D\nGovt. Degree Boys College, Surjani Town\n\n\n600060[877]         ***********                   ***********                   ***********                   ***********";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
std::cout << m[1].str() << '\n';
}
0

Другие решения

std::string::size_t loc = str.find('[');
while (loc != std::string::npos) {
++loc;
std::string::size_t end = str.find(']', loc);
if (end == std::string::npos)
break;
std::cout << str.substr(loc, end - loc);
loc = str.find('[', end);
}
0

По вопросам рекламы [email protected]