![]() |
Datenbank: firebird • Version: 2.5 • Zugriff über: Delphi XE
Buchstaben Kette in Klammern erkennen
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:
|
AW: Buchstaben Kette in Klammern erkennen
Okay, hab mein Fehler erkannt,[[:ALPHA:]] funktioniert nur bei similar to. :oops:
|
AW: Buchstaben Kette in Klammern erkennen
Ich hab es jetzt so versucht...
Code:
Leider ist die Bedingung immernoch nicht Wahr, weiß jemand warum?
IF (:ISTRING SIMILAR TO '([[:ALPHA:]äöüÄÖÜß]*)' ) THEN
begin IString = REPLACE(:IString,')',')^'); end |
AW: Buchstaben Kette in Klammern erkennen
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) |
AW: Buchstaben Kette in Klammern erkennen
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.
|
AW: Buchstaben Kette in Klammern erkennen
Zitat:
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. |
AW: Buchstaben Kette in Klammern erkennen
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; |
AW: Buchstaben Kette in Klammern erkennen
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. :lol:
Eine ähnlcihe logik hatte ich zusammengebaut.
Code:
Hier funktioniert nur das if (NUMBER_C SIMILAR TO '(') nicht. Es kommt ein Fehler "Invalid SIMILAR TO pattern".
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 Ziemlich verzweifelnd. :? |
AW: Buchstaben Kette in Klammern erkennen
Zitat:
|
AW: Buchstaben Kette in Klammern erkennen
Zitat:
Delphi-Quellcode:
Fehlt da nur ein Doppelpunkt?
if (:NUMBER_C SIMILAR TO
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz