C++ 查找并打印C+中括号之间的数字+;使用正则表达式

C++ 查找并打印C+中括号之间的数字+;使用正则表达式,c++,regex,regex-negation,regex-lookarounds,regex-greedy,C++,Regex,Regex Negation,Regex Lookarounds,Regex Greedy,我用这个代码找到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 G

我用这个代码找到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[+] SIGN


600023[545]         600024[554]         600031[605]              600052[560]              ***********

Grade : D
Govt. Degree Boys College, Surjani Town


600060[877]         ***********                   ***********                   ***********                   ***********
/////在第二次迭代中,当找到[554]时。m.size()不会重置为零,从而导致错误。我怎样才能解决它?如何从整个文件中全局搜索括号中的数字

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
ifstreammyfile;
myfile.open(“test.txt”);
如果(!myfile)
{

首先,您应该修复<代码>正则表达式E(“\ [(\d+)])< <代码> >代码>正则表达式E(“\\(\d+)))< />代码>(或<代码>正则表达式E(r)(\[(\d+)])< < /> >如果C++环境支持原始字符串文字)<

然后,您需要获得多个匹配项,而不仅仅是您当前正在执行的所有捕获组内容。使用一个,并通过
m[1].str()访问组1内容

见:

std::regex r(“\\[(\\d+)”);
std::string s=“成功的候选人在毕业论文中根据其卷号显示,在困难情况下为提高成绩而给予的额外分数[最多五分]用加号[+]表示,而种族分数用插入符号[+]表示\n\n\n600023[545]600024[554]600031[605]600052[560]************\n\n贸易:苏尔贾尼镇D\nGovt.学位男书院\n\n\n600060[877]**************************************************”;
for(std::sregx_迭代器i=std::sregx_迭代器(s.begin(),s.end(),r);
i!=std::sregex_迭代器();
++(一)
{
std::smatch m=*i;
std::cout
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)
打破

std::难道这段代码的唯一答案可以通过添加一些文本来解释代码正在做什么以及它是如何解决问题的。--我正在使用Visual Studio 2010。当我使用std::regex r(\[(\\d+)”)时,当代码执行此操作时,代码崩溃并给出错误。我尝试了许多regex表达式,但大多数都不起作用。请尝试
r(“\\[(\\d+\\]”)
谢谢它能工作。现在我面临的问题是,我正在读取的字符串太大,Visual Studio无法终止该操作。因此我需要一种在文本文件中进行全局搜索的方法。我的数据在文本文件中。我刚刚在问题中添加了几行。它们有什么办法吗?我仍然不明白为什么Visual Studio没有这样做支持一些正确的正则表达式。我正在使用while(!myfile.eof()){getline(myfile,s);}从文件中获取字符串,然后使用正则迭代器查找数字。是的,这是处理文本文件最有效的方法:逐行读取并分别处理每个文本文件。我怀疑正则表达式是否存在问题。请参阅
#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;
}
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';
}
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);
}