tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
3171
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Oklino Oklino ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    44
    Hallo ich habe mir kürzlich und nach langem hin und her mit dem Builder von boost die regex library zu installieren (am ende doch via mak file)

    Nun jetzt muss ich erst einmal zugeben, dass mein teschnisches (IT) Englisch mittelmäßig bis schlecht ist und ich in der Boost Dokumentation nicht weiter komme (ein Grund weshalb ich denke, dass Tutorials.de die richtige Anlaufstelle für Hilfe ist )

    Ich habe ein Programm mit dem BCB6.0 geschrieben und führe dort mittels dieser Zeilen:

    Code :
    1
    2
    3
    4
    
    strE = strListOrte->Strings[0].c_str();
                s = dinohsname.c_str();
                static const boost::regex e(strE);
                bMatch = regex_search(s, e);

    einen vergleich durch. Ziel ist es dass hier ein Match bei z.B.

    e = recklingh[a-z].*
    und
    s = rechlinghsn orthlostr

    erzielt wird. Leider funktioniert das in dieser Version nicht. Im ersten Anlauf matchen Strings wie

    abcd[a-z].* und abcd efg
    kommt dann aber
    abc[a-z].* und abcd efg - was kein match ergibt, dann match das Programm im weiteren verlauf selbst abcd[a-z].* und abcd efg nicht mehr... Man hat mir bis jetzt ohne weitere Hinweise angedeutet, dass ich noch einen Parameter/Argument einsetzen muss um festzulegen WIE gematch werden soll. Die Liste in der Doku verstehe ich allerdings nicht :/ kann mir bei der ganzen Sache hier jemand weiterhelfen?

    Vielen Dank im Voraus
    Geändert von Oklino (14.03.06 um 10:37 Uhr)
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Oklino
    Im ersten Anlauf matchen Strings wie

    abcd[a-z].* und abcd efg
    kommt dann aber
    abc[a-z].* und abcd efg - was kein match ergibt, dann match das Programm im weiteren verlauf selbst abcd[a-z].* und abcd efg nicht mehr...
    "abcd efg" kann nicht vom reg. Ausdruck "abcd[a-z].*" akzeptiert werden - das Leerzeichen ist nicht Teil der Zeichenklasse [a-z]. Im zweiten Fall sollte allerdings sollte der Ausdruck mit dem Suchstring übereinstimmen.

    Also bei mir funktioniert's auch ohne spezielle Flags:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    #include <iostream>
    #include <string>
    #include <boost/regex.hpp>
     
    using namespace std;
     
    int main() {
            boost::regex expr ("abcd[a-z].*");
     
            string line;
            while (getline(cin, line)) {
                    if (boost::regex_search(line, expr)) {
                            cout << "line matches." << endl;
                    } else {
                            cout << "line does *not* match." << endl;
                    }
            }
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Oklino Oklino ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    44
    ups ich habe gerade gesehen, dass ich oben die Version mit regex_search() gepostet habe... naja... aber damit sollte es dann funktionieren, wenn ich den regulären Ausdruck anpasse?

    es sollte dann doch mit

    exp = abc[a-z| |0-9]*
    strE = abcd efg 123

    klappen, oder?

    achja nochwas... der RegexCoach meinte dass [a-z].* nen match macht, ich denke mal weil "." für "beliebiges Zeichen"(auch leerzeichen) steht und ".*" wäre dann ja "beliebiges zeichen, beliebig(es Zeichen beliebig) oft" oder so ähnlich.
    Geändert von Oklino (16.03.06 um 12:14 Uhr)
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Oklino
    ups ich habe gerade gesehen, dass ich oben die Version mit regex_search() gepostet habe... naja... aber damit sollte es dann funktionieren, wenn ich den regulären Ausdruck anpasse?
    Ja.

    Zitat Zitat von Oklino
    es sollte dann doch mit

    exp = abc[a-z| |0-9]*
    strE = abcd efg 123

    klappen, oder?
    Ja. (Der senkrechte Strich ist allerdings doppelt)

    Zitat Zitat von Oklino
    achja nochwas... der RegexCoach meinte dass [a-z].* nen match macht, ich denke mal weil "." für "beliebiges Zeichen"(auch leerzeichen) steht und ".*" wäre dann ja "beliebiges zeichen, beliebig(es Zeichen beliebig) oft" oder so ähnlich.
    Ja.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Oklino Oklino ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    44
    OR bei reg. Audr. = || ?

    [a-z|| ||0-9]*

    ?
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Oklino
    OR bei reg. Audr. = || ?

    [a-z|| ||0-9]*

    ?
    Vielleicht hättest du mal sagen sollen was du mit dem Ausdruck meinst.

    Die eckigen Klammern sind eine Zeichenklasse, d.h. an Stelle dieser Klasse kann ein Zeichen von innerhalb der Klammern stehen. Spezialzeichen verlieren innerhalb einer Zeichenklasse ihre Bedeutung. D.h. ein | ist ein ganz normales Zeichen - und wenn du es 10-mal innerhalb der Klammern schreibst, wird es doch nur max. 1-mal mit einem Zeichen im Suchstring übereinstimmen.

    Was dein Ausdruck bedeutet ist folgendes: Zuerst muß ein Zeichen aus dem Bereich a bis z oder ein | Zeichen oder ein | Zeichen oder ein Leerzeichen oder ein | Zeichen oder ein | Zeichen oder ein Zeichen im Bereich 0 bis 9 sein. Das dann beliebig oft (auch überhaupt nicht!).

    Ich nehme mal an du willst Buchstaben, Leerzeichen und Ziffern akzeptieren: [a-z 0-9]*

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Oklino Oklino ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    44
    ja genau danke.

    ich hab das soweit korrigiert, aber beim debuggen matcht er

    recklingh[a-z 0-9]*
    immernoch nicht mit
    recklinhsn orthlostr nr 190

    vielleicht mache ich ja was anderes falsch. ich poste mal nen paar Zeilen, die vielleicht wichtig/fehlerhaft sein könnten...

    bau des pattern:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    case 5:
                          strE = strListOrte->Strings[0].c_str();
     
                          if(strListOrte->Count == 1)
                          strE += "[a-z 0-9]*";
                          else
                          strE += "[a-z 0-9]* ";
     
                              for(i = 1; i < (strListOrte->Count); i++)
                              {
                              strE += strListOrte->Strings[i].c_str();
                              strE += "[a-z 0-9]* ";
     
                              if(i == (strListOrte->Count-1))
                              strE += "[a-z 0-9]*";
                              }
     
                          break;
                          default:
                          bMatch = false;
                          }//endofswitch

    dann das Matchen...

    Code :
    1
    2
    3
    
    static const boost::regex e(strE);
    bMatch = boost::regex_match(s, e); 
               if(bMatch == 0)

    zwischendruch wird der Ort noch von mir gekürzt:

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    nVarCounter = strListOrte->Strings[0].Length(); // wie lang ist der Ortname?
    if(nVarCounter > 1)
    {
    strListOrte->Strings[0] = strListOrte->Strings[0].SetLength((nVarCounter-1));
    nVarCounter2 = strListOrte->Count;
     
    (...)
    danach wird dann wieder das obige Konstrukt wiederholt
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Oklino
    ich hab das soweit korrigiert, aber beim debuggen matcht er

    recklingh[a-z 0-9]*
    immernoch nicht mit
    recklinhsn orthlostr nr 190
    Ist das nur 'n Tippfehler das da kein g drin ist? (warum kopierst du nicht und fügst ein?)

    Zitat Zitat von Oklino
    Code :
    1
    
    static const boost::regex e(strE);
    Du weißt aber schon was static bedeutet?

    Hast du dir den reg. Ausdruck und den String mal ausgeben lassen?
    Code :
    1
    
    cerr << e.str()
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Oklino Oklino ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    44
    Zitat Zitat von deepthroat
    Ist das nur 'n Tippfehler das da kein g drin ist? (warum kopierst du nicht und fügst ein?)

    Du weißt aber schon was static bedeutet?

    Hast du dir den reg. Ausdruck und den String mal ausgeben lassen?
    Code :
    1
    
    cerr << e.str()
    Gruß
    zu 1: war nen Tippfehler. Die Ausdrücke werden ja ~dynamisch~ erzeugt. deswegen hab ich nicht kopiert.

    zu 2: jetzt ja... *ouch*

    zu 3. die inhalte sind wie oben (mit dem Tippfehler das ) (wobei ich mir nur strE habe ausgeben lassen - was wohl der fehler war)
    -----------------------------------------------------------------------------------------------

    nach dem Entfernen von static const...:

    ich fasse es nicht !! der geht *löl* danke *knutsch* es geht (etliche Stunden saß ich davor... DANKE )
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Oklino
    ich fasse es nicht !! der geht *löl* danke *knutsch* es geht (etliche Stunden saß ich davor... DANKE )
    Hihi. Nix zu danken, dafür bin ich ja da Aber setz doch noch schnell das Thema auf erledigt.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Boost Regex
    Von Jacal im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 27.08.10, 14:04
  2. Antworten: 4
    Letzter Beitrag: 16.01.10, 12:50
  3. Hile bei Library Boost(regex)
    Von pamax im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 03.08.07, 12:11
  4. Antworten: 1
    Letzter Beitrag: 08.03.07, 16:45
  5. [AE] Speed Boost
    Von haebel im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 4
    Letzter Beitrag: 04.08.03, 09:35