AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Buchstaben Kette in Klammern erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

Buchstaben Kette in Klammern erkennen

Ein Thema von Trafel21 · begonnen am 31. Jan 2019 · letzter Beitrag vom 31. Jan 2019
Antwort Antwort
Seite 1 von 2  1 2      
Trafel21

Registriert seit: 16. Nov 2018
69 Beiträge
 
#1

Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 08:20
Datenbank: firebird • Version: 2.5 • Zugriff über: Delphi XE
Hallo zusammen,

ich würde gern eine Buchstabenfolge in Klammern per SQL erkennen.

In einem STRING steht folgendes: '0333 333333 (Stadt) 0444 44444 (Dorf) 3434343 ...'

Jetzt würde ich gern vor jeder Buchstabenfolge in einer Klammer ein ^ vorsetzen:

REPLACE(:ISTRING,' ([[:ALPHA:]]*) ','^([[:ALPHA:]]*)');

In der Firebird Dokumentation steht:

Zitat:
'Icaque' similar to '[[:ALPHA:]]*' -- true
Eigentlich sollte es funktionieren aber... tut es nicht.
  Mit Zitat antworten Zitat
Trafel21

Registriert seit: 16. Nov 2018
69 Beiträge
 
#2

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 09:02
Okay, hab mein Fehler erkannt,[[:ALPHA:]] funktioniert nur bei similar to.
  Mit Zitat antworten Zitat
Trafel21

Registriert seit: 16. Nov 2018
69 Beiträge
 
#3

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 10:55
Ich hab es jetzt so versucht...

Code:
    IF (:ISTRING SIMILAR TO '([[:ALPHA:]äöüÄÖÜß]*)' ) THEN
    begin
      IString = REPLACE(:IString,')',')^');
    end
Leider ist die Bedingung immernoch nicht Wahr, weiß jemand warum?
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 11:32
Du könntest alternativ generell vor Jede Klammer ein ^ setzen, wenn ichs richtig verstehe ist das ja genau das was du willst.

Dafür gibt es Stringreplace:

Delphi-Quellcode:
  String := '(123)(456)';
  IString := stringreplace(IString, '(', '^(',[rfReplaceAll, rfIgnoreCase]);
  //Ergebnis: ^(123)^(456)
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 11:53
Es geht um Firebird, nicht um Delphi. Klar könnte man da auch ganz stumpf mit REPLACE vor jede öffnende Klammer das ^ setzen, allerdings wäre das dann ohne jede Prüfung.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Trafel21

Registriert seit: 16. Nov 2018
69 Beiträge
 
#6

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 11:55
Du könntest alternativ generell vor Jede Klammer ein ^ setzen, wenn ichs richtig verstehe ist das ja genau das was du willst.

Dafür gibt es Stringreplace:

Delphi-Quellcode:
  String := '(123)(456)';
  IString := stringreplace(IString, '(', '^(',[rfReplaceAll, rfIgnoreCase]);
  //Ergebnis: ^(123)^(456)
In den Klammern dürfen nur Wörter stehen. (Martin) -> ^(Martin)
Bei Zahlenfolgen Bspw, (030) soll nicht passieren.

Meine Spaltenwert sehen meistens so aus.

0361-333333 (Martin) 030-432432 (Stefan)

Ich darf explizit nur Buchstaben innerhalb einer Klammer stehen, alles andere nicht. Bspw. Können die Vorwahlen auch in Klammern stehen, die sollen nicht bearbeitet werden.

Geändert von Trafel21 (31. Jan 2019 um 12:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 12:29
sry, dachte das dies über die normale Programmierung ging also Daten aus Datenbank holen, verarbeiten und wieder rein schieben und nicht direkt über den DB Zugriff.

Sonst hätte man es ja recht simpel so lösen können:
Delphi-Quellcode:
procedure XYZ();
var
 i, j : integer;
 IString : string;
 inhalt : string;
begin
  IString := '0361-333333 (Martin) (030)-432432 (Stefan)';
  for i := 1 to length(IString) do //für die länge des ganzen Strings nach der Klammer suchen
  begin
    if (IString[i] = '(') and (IString[i-1] <> '^') then //Wenn die Klammer gefunden wurde und diese nicht schon ersetzt wurde weiter machen
    begin
      inhalt := ''; //Inhalt zurücksetzen
      j := i + 1; //Nach der ( Inhalt auslesen
      while IString[j] <> ')do // ) wurde gefunden
      begin
        inhalt := inhalt + IString[j]; //Inhalt der Klammer auslesen
        inc(j);
      end; // Inhalt der gefundenen Klammern steht fest
      try
        strtoint(inhalt); //Kann der Inhalt in eine Zahl umgewandelt werden?
      except //Nein? Dann ist es ein String und ersetze ( durch ^(
        IString := stringreplace(IString, '('+inhalt+')', '^('+inhalt+')', []);
      end;
    end;
  end;
  Showmessage(IString); // Ergebnis: 0361-333333 ^(Martin) (030)-432432 ^(Stefan)
end;
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (31. Jan 2019 um 13:21 Uhr) Grund: Kommentiert
  Mit Zitat antworten Zitat
Trafel21

Registriert seit: 16. Nov 2018
69 Beiträge
 
#8

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 13:29
Danke für deine Hilfe und deinen Aufwand Moombas, leider bin ich im SQL unterwegs und schreibe eine Procedur. In SQL gibt es keine for schleifen, was ich ziemlich behämmert finde.

Eine ähnlcihe logik hatte ich zusammengebaut.

Code:
I=0;
NUMBER_C = '';
NUMBERS = '';
    while (:I<CHAR_LENGTH(:IN_NUMBERS)) do // String durchgehen
    begin
      I=:I+1;
      NUMBER_C = SUBSTRING(:IN_NUMBERS FROM :I FOR 1);
     
      if (NUMBER_C SIMILAR TO '(') then // Wenn ( gefunden
      begin
        NUMBERS = :NUMBER_C; -- ( auslesen
        I=:I+1;

        while (:I<CHAR_LENGTH(:IN_NUMBERS)) do // weitere while schleife für Buchstaben
        begin
          IF (:NUMBER_C SIMILAR TO '[[:ALPHA:]äöüÄÖÜß]') THEN // Wenn Zeichen ein Buchstabe ist...
          begin
            NUMBERS = NUMBERS || :NUMBER_C; // Nach der ( Buchstabeninhalt auslesen

            IF (:NUMBER_C SIMILAR TO '`') THEN // Wenn ) gefunden
            begin
              NUMBERS = NUMBERS || :NUMBER_C; -- ) auslesen

              IN_NUMBERS = REPLACE(:IN_NUMBERS,NUMBERS,NUMBERS||'^'); // zur Trennung ^ setzen
            end
          end
          else
          begin
          break; /* break aus der while, keine Buchstabe */
          end
        I=:I+1;
        end
      end
    end
Hier funktioniert nur das if (NUMBER_C SIMILAR TO '(') nicht. Es kommt ein Fehler "Invalid SIMILAR TO pattern".

Ziemlich verzweifelnd.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 13:39
Zitat:
In SQL gibt es keine for schleifen, was ich ziemlich behämmert finde.
In PSQL schon (SP, Trigger, execution block)
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#10

AW: Buchstaben Kette in Klammern erkennen

  Alt 31. Jan 2019, 14:01
Hier funktioniert nur das if (NUMBER_C SIMILAR TO '(') nicht. Es kommt ein Fehler "Invalid SIMILAR TO pattern".

Ziemlich verzweifelnd.
bei den anderen Ifs schreibst Du if (:NUMBER_C SIMILAR TO Fehlt da nur ein Doppelpunkt?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz