2016-09-26 5 views
-2

Was ist die einfache Möglichkeit, Zahlen aus vorgegebenen Zeichenfolge Muster mit regulären Ausdrücken zu bekommen?cpp Get Zahlen aus Zeichenfolge

die Bespannbild ist wie,

${type:1234} ${type:2345} 

ich die Zahlen wollen, in diesem Fall 1234, 2345.

die Zeichenfolge patten auch Leerzeichen enthalten kann,

${(WS)*type(WS)*:(WS)*1234(WS)*} , ... (more like this) 

I Außerdem muss überprüft werden, ob die Zeichenfolge ein gültiges Muster ist, und wenn dies der Fall ist, die Zahlen extrahieren.

Ich weiß, dass es leicht mit Tokenizer getan werden kann, aber ich denke, es wird besser sein, reguläre Ausdrücke zu verwenden.

+0

Haben Sie so etwas wie dies bedeuten: '(\ $ \ s * \ {\ s * Typ \ s * \: \ s * [0-9] + \ s * \} \ s *) * '? – Blobonat

+2

Dies ist eine Codeanforderung. OP benötigt nicht nur eine Regex, er braucht auch ein funktionierendes C/C++ Programm, um zu tun, was er will. Er hat nicht einmal angegeben, welche Sprache er möchte, C oder C++ ...! – Jahid

+0

@ WiktorStribiżew Aber OP versucht, eine RegEx zu bauen. Er kennt einfach nicht die richtige Syntax. IMO diese Frage enthält genug Informationen, um eine gute Antwort zu geben. (Aber ich stimme zu, dass die Codeanforderung für den C/C++ Teil zu breit ist, um zu antworten) – Blobonat

Antwort

1

Sie verwenden etwas Magie zu erreichen, was Sie mit Schleifen wollen:

#include <iostream> 
#include <string> 

int main() 
{ 

    std::string str("${type:1234} ${type:2345}"); 

    int n = 0; 

    for(int i(0); i < str.length(); i++) 
    { 
     if(isdigit(str[i])) 
     { 
      n++; 
      while(isdigit(str[i])) 
       i++; 
     } 
    } 

    std::cout << "There are: " << n << std::endl; 

    std::string* strTmp = new std::string[n]; 
    int j = 0; 

    for(int i = 0; i < str.length(); i++) 
    { 
     if(isdigit(str[i])) 
     { 
      while(isdigit(str[i])) 
      { 
       strTmp[j] += str[i]; 
       i++; 
      } 
      j++; 
     } 
    } 

    for(int i = 0; i < n; i++) 
     std::cout << strTmp[i] << std::endl; 

    // now you have strTmo holding numbers as strings you can convert them to integer: 

    int *pInt = new int[n]; 

    for(int i = 0; i < n; i++) 
     pInt[i] = atoi(strTmp[i].c_str()); 

    for(int i = 0; i < n; i++) 
     std::cout << "value " << i+1 << ": " << pInt[i] << std::endl; 

    delete[] strTmp; 
    strTmp = NULL; 
    delete[] pInt; 
    pInt = NULL; 


    std::cout << std::endl; 
    return 0; 
} 
Verwandte Themen