Announcement

Collapse
No announcement yet.

string verändern mit match

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • string verändern mit match

    Hallo zusammen,
    ich habe folgenden String:

    E0D20080624
    E1D135159

    E0D steht für Datum, dann Jahr, Monat, Tag
    E1D steht für uhrzeit, dann Stunde, Minute, Sekunde

    nun möchte ich eben diesen String suchen, verändern in:
    Datum 24.06.2008
    Uhrzeit 13:51:59
    und wieder ausgeben.

    habe es so versucht:
    [highlight=c++]
    for each (Match match in Regex::Matches(sb, "E1D?\\d{6}")){
    String^ time = match.Result("${time}");
    DateTime result = DateTime::ParseExact(time, "HHmmss", CultureInfo::CurrentCulture);
    time = result.ToString("HH:mm:ss");
    sb = sb->Replace(match.Value, "Uhrzeit " + time);
    }
    for each (Match match in Regex::Matches(sb, "E0D(?<date>\\d{8})")){
    string date = match.Result("${date}");
    DateTime result = DateTime::ParseExact(date, String::Format("yyyyMMdd"), CultureInfo::CurrentCulture);
    date = result.ToString(String.Format("dd.MM.yyyy"));
    sb = sb->Replace(match.Value, "Datum " + date);
    }
    richTextBoxKonvertiert->Text = sb->ToString();
    [/highlight]
    leider ohne Erfolg. Syntax muß verkehrt sein. Habe versucht den Code von C# nach VC++ umzusetzen.

    Wer kann mir helfen?

    Gruß
    Andreas

  • #2
    ein match matcht -> siehe Replace
    Christian

    Comment


    • #3
      Ja so weit wars mir klar ; )
      ich denke bei mir stimmt was mit den Daten nicht die in rot gedruckt sind.

      Comment


      • #4
        Du kannst doch mit dem Debugger rausbekommen, ob time stimmt.

        Danach kannst du schauen, ob match.Value oder match.Result für die ersetzung zu nehmen ist.

        M.E. muss es doch der gleiche Wert sein, aus dem du time extrahierst....
        Christian

        Comment


        • #5
          error C2665: "System::Text::RegularExpressions::Regex::Matches" : Durch keine der 4 Überladungen konnten alle Argumenttypen konvertiert werden.

          Das sagt der Compiler.

          Comment


          • #6
            Wenn du erst

            sb->ToString

            machen musst, was ist sb?? Ein StringBuffer?

            Ein matches (StringBuffer, String) kennt die Klasse nicht.....
            Christian

            Comment


            • #7
              [highlight=c++]
              String^ zuKonvertieren = richTextBoxOriginal->Text;;
              StringBuilder^ sb = gcnew StringBuilder( zuKonvertieren );
              sb->Replace("%", "");
              for each (Match match in Regex::Matches(sb, "E1D\\d{6}")){
              String^ time = match.Result("$<time>");
              DateTime result = DateTime::ParseExact(time, "HHmmss", CultureInfo::CurrentCulture);
              time = result.ToString("HH:mm:ss");
              sb = sb->Replace(match.Value, "Uhrzeit " + time);
              }
              richTextBoxKonvertiert->Text = sb->ToString();
              [/highlight]

              Also sb ist eine StringBuilder-Instanz also eigentlich ein String oder?
              und (String,String) kennt matches doch

              Die IDE meckert denke ich weil ich den Kram in Anführungszeichen irgendwie falsch habe.
              "E1D\\d{6}" kann das sein ?
              Zuletzt editiert von andreas-hafner; 11.05.2010, 14:39. Reason: hinzugefügt

              Comment


              • #8
                Also sb ist eine StringBuilder-Instanz also eigentlich ein String oder?
                Nein, wenn es ein String wäre, wäre es ja String. Es ist ein Unterschied zwischen StringBuffer und String......

                Der Regl. Ausdruck ist m.E. ok
                Christian

                Comment


                • #9
                  aha ok dann muss ich mal schauen. hab jetzt auch schon versucht sb vor der for each Sache wieder in einen String zu schreiben geht aber auch nicht.

                  [highlight=C++]
                  // Zeitpunkt beim Einschalten E0D20080624
                  // Zeitpunkt beim Einschalten E1D135159
                  String^ konvText;
                  konvText = sb->ToString();
                  for each (Match match in Regex::Matches(konvText, "E1D\\d{6}"))
                  {
                  String^ time = match.Result("$<time>");
                  DateTime result = DateTime::ParseExact(time, "HHmmss", CultureInfo::CurrentCulture);
                  time = result.ToString("HH:mm:ss");
                  sb = sb->Replace(match.Value, "Uhrzeit " + time);
                  }
                  [/highlight]

                  Neue Fehlermeldung:
                  error C2440: 'Typumwandlung': 'System::Object ^' kann nicht in 'System::Text::RegularExpressions::Match' konvertiert werden
                  Zuletzt editiert von andreas-hafner; 11.05.2010, 15:22.

                  Comment


                  • #10
                    Schon mal

                    String konvText;

                    probiert
                    Christian

                    Comment


                    • #11
                      String ohne ^ ist in Visual C++/CLI nicht möglich soweit ich weiß. Hab es trotzdem gerade versucht. Ohne "Dach" kommt eine Meldung, daß das Dach benötigt wird.

                      Comment


                      • #12
                        Naja ist ja auch klar ^ ist managed Code und ohne Dach ist unmanaged Code. Warum baust Du denn diese Funktion in VC++ nach? Nimm doch einfach die Assembly in der die Funktion drinne ist und bau in VC++ nur eine wrapper Funktion.
                        Muss ich leider hin und wieder für meine C++ Kollegen auch machen

                        Comment


                        • #13
                          Ok, davin versteh ich bis jetzt noch garnix. ich habe den Code in C# funktionsfähig. Und wollte, da ich gerade VC++ lerne den Code umsetzen und das Projekt erweitern mit nem Editor und einem Zeitberrechnungsprogramm.
                          So und jetzt zu dem wrapper:
                          -Wie funktioniert das?
                          -Macht das Sinn wegen den 10 Zeilen?
                          Vielen Dank schonmal.

                          Gruß
                          Andreas

                          Comment


                          • #14
                            1. Ein Wrapper ist eine Funktion die die eigentliche Bearbeitung einfach nur weiter leitet. Die Funktionalität hast Du ja in C# schon beschrieben. Jetzt schreibst Du in C++ eine ganz einfach Funktion die nur die Parameter an C# weiter reicht. So etwas macht z.B. Sinn wenn Kollegen nicht in der .NET Welt programmieren, sie aber trotzdem in der Lage sein sollen Deine Funktionen zu benutzen.

                            2. Meines erachtens macht das IMMER Sinn. Wenn Du den Code einfach "kopierst" (das gilt auch wenn es eine andere Programmiersprache ist) beschreibst Du das gleiche Verhalten 2 mal. Wenn Du nun etwas an dieser Logik änderst hast Du 2 Stellen im Code zu pflegen anstatt einer.

                            Wenn Du allerdings nur einen Wrapper baust musst Du lediglich die dahinter liegende Dll austauschen. Und zwar ist das die die in C# programmiert ist.

                            Generell würde ich Dir eher raten erstmal auf C++ zu verzichten. Das ist unnötig komplex und bringt eigentlich keinen wirklichen Mehrwert. Nur wenn es wirklich auf Speichermanagement und Performance ankommt (ja das ist ein strittiges Thema) würde ich auf C++ setzen. Dazu gehört allerdings VIEL Know How. Ansonsten: Finger Weg!

                            Comment


                            • #15
                              Tja dann werd ich mal den wrapper nachschlagen.
                              Welche Sprache dann? C#, VB.Net.
                              Und warum nicht C++/CLI ? Ist doch mit managed Code auch .net oder?

                              Gruß
                              Andreas

                              Comment

                              Working...
                              X