Prüfen ob String bestimmte Werte enthält

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
HonkXL
Beiträge: 1
Registriert: Fr 2. Jan 2015, 10:51

Prüfen ob String bestimmte Werte enthält

Beitrag von HonkXL »

Hallo,
ich habe einen String, der bestimmte Werte nicht enthalten darf, wie z.B. Umlaute # , ; . : - _ und einige weitere.
Jetzt könnte ich natürlich mit If Pos(...) ermitteln, ob ein einzelnes Zeichen enthalten ist, und dann entsprechend darauf reagieren und das jeweils verschachteln.
Das ganze explodiert aber, wenn ich da mal irgendwann was ändern muss.

Schöner wäre es, wenn ich irgendwo ein Array hätte, in dem die nicht erlaubten Zeichen enthalten sind, und dann darauf prüfen könnte.
Geht das irgendwie? Habe vieles ausprobiert und auch im Forum gesucht, aber leider nicht weitergekommen.

Gruß
HonkXL

relocate
Beiträge: 61
Registriert: Di 24. Jan 2012, 11:47
OS, Lazarus, FPC: Win (L- FPC 2.4.4 + 2.6.4)
CPU-Target: 32Bit

Re: Prüfen ob String bestimmte Werte enthält

Beitrag von relocate »

Wenn es einzelne Zeichen sind, dann den String wie ein Array durchgehen und mit dem IN Operator prüfen.

https://www.experts-exchange.com/questi ... Z-0-9.html
Würde ich die Dinge so wie alle anderen machen, hätte ich so manche Probleme nicht.

Aber das wäre langweilig.

siro
Beiträge: 731
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Prüfen ob String bestimmte Werte enthält

Beitrag von siro »

Hallo HonkXL

Code: Alles auswählen

 
// hier schreibst Du alle erlaubten Zeichen rein
// const Erlaubt = ['A','B','c','d'];
 
// Du kannst es aber auch aufteilen und Bereiche angeben:
 
const Buchstaben    = ['A'..'Z','a'..'z'];
const Zahlen        = ['0'..'9'];
const Sonderzeichen = ['+','-','*','/'];
 
const Erlaubt       = Buchstaben + Zahlen + Sonderzeichen;
 
// -----------------------------------------------------------------------------
// Die Funktion liefert TRUE zurück, wenn alle Zeichen erlaubt sind, sonst FALSE
// Aufruf:  if StringValid(......) then.....
 
function StringValid(var s:string):Boolean;
var i:Integer;
begin
  result:=FALSE;                      // Annahme Ergbnis ist FALSE (falsche Zeichen vorhanden)
  for i:=1 to length(s) do begin      // alle Zeichen durchlaufen
    if NOT (s[i] in Erlaubt) then exit;   // beim ersten falschen Zeichen sofort abbrechen
  end;
  result:=TRUE// alle Zeichen okay, nun TRUE zurück liefern
end;
 
 


Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Prüfen ob String bestimmte Werte enthält

Beitrag von m.fuchs »

Was machst du denn in dem Fall, dass ein unerlaubtes Zeichen gefunden wurde? Falls du das dann nur entfernen willst, kann die auch StringsReplace
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Prüfen ob String bestimmte Werte enthält

Beitrag von Warf »

siro hat geschrieben:Hallo HonkXL

Code: Alles auswählen

 
// hier schreibst Du alle erlaubten Zeichen rein
// const Erlaubt = ['A','B','c','d'];
 
// Du kannst es aber auch aufteilen und Bereiche angeben:
 
const Buchstaben    = ['A'..'Z','a'..'z'];
const Zahlen        = ['0'..'9'];
const Sonderzeichen = ['+','-','*','/'];
 
const Erlaubt       = Buchstaben + Zahlen + Sonderzeichen;
 
// -----------------------------------------------------------------------------
// Die Funktion liefert TRUE zurück, wenn alle Zeichen erlaubt sind, sonst FALSE
// Aufruf:  if StringValid(......) then.....
 
function StringValid(var s:string):Boolean;
var i:Integer;
begin
  result:=FALSE;                      // Annahme Ergbnis ist FALSE (falsche Zeichen vorhanden)
  for i:=1 to length(s) do begin      // alle Zeichen durchlaufen
    if NOT (s[i] in Erlaubt) then exit;   // beim ersten falschen Zeichen sofort abbrechen
  end;
  result:=TRUE// alle Zeichen okay, nun TRUE zurück liefern
end;
 
 


Siro


Das ist grundsätzlich das richtige vorgehen, allerdings warum var im parameter? Wenn überhaupt ein quantifier dann const, da ein string ein Zeiger ist, ist das allerdings auch herzlichst egal. Ansonsten könnte man das mit einem PChar etwas kürzer und eventuell "eleganter" gestalten

Code: Alles auswählen

function CheckString(str: PChar): Boolean;
const
  useableChars = ['A'..'Z']; // weitere buchstaben hier hinzufügen
begin
  while Assigned(str) and (^str in useableChars ) do Inc(str);
  Result := Assigned(str) and Boolean(^str);
end;

siro
Beiträge: 731
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Prüfen ob String bestimmte Werte enthält

Beitrag von siro »

Hallo Warf
ich hab das "var" genommen, weil ja nur die Adresse des String übergeben werden soll.
Ich hab ne Weile überlegt ob das auch mit "const" geht, bin mir da aber nicht sicher.
const wäre dann sicher sinnvoller, da der String ja nicht verändert werden soll.

Was mich jetzt etwas wundert in deinem Code.
Woher weis denn dein Code wann das Ende des Strings erreicht ist ?
While Assigned bedeutet doch nur dass der Zeiger nicht auf NIL steht soweit ich weis.
wenn nun der pchar incrementiert wird wandert er doch immer weiter, aber bis wohin ?
Hat der String wie bei "C" eine 0 Markierung ? dann würde es nicht in den useableChars auftauchen und somit okay.

Irgendwie bekomme ich deinen Code nicht zum laufen, das ^ muss auch hinter str und nicht davor, sonst compiliert er garnicht.
Das result leuchtet mir auch nicht ein... :shock:
Boolean(str^); wird TRUE wenn str irgendwo hinzeigt wo keine 0 ist.

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Prüfen ob String bestimmte Werte enthält

Beitrag von Warf »

siro hat geschrieben:Hallo Warf
ich hab das "var" genommen, weil ja nur die Adresse des String übergeben werden soll.
Ich hab ne Weile überlegt ob das auch mit "const" geht, bin mir da aber nicht sicher.
const wäre dann sicher sinnvoller, da der String ja nicht verändert werden soll.

Ein String ist so oder so nur ein Zeiger von daher bringt die Referenzübergabe da nichts. Ansonsten ist const genau dafür da, übergibt nur eine Referenz, die darf dafür nicht geändert werden.

siro hat geschrieben:Hat der String wie bei "C" eine 0 Markierung ? dann würde es nicht in den useableChars auftauchen und somit okay.

genau.

siro hat geschrieben:Irgendwie bekomme ich deinen Code nicht zum laufen, das ^ muss auch hinter str und nicht davor, sonst compiliert er garnicht.
Das result leuchtet mir auch nicht ein... :shock:
Boolean(str^); wird TRUE wenn str irgendwo hinzeigt wo keine 0 ist.

Siro

Ups hast recht, sollte noch ein not hin. Damit ist es genau dann True wenn das ende erreicht wurde, False wenn da irgend ein anderer Char steht

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Prüfen ob String bestimmte Werte enthält

Beitrag von m.fuchs »

Warf hat geschrieben:Ein String ist so oder so nur ein Zeiger von daher bringt die Referenzübergabe da nichts.

Das stimmt so nicht. Wenn man sich den Assembler-Output von beiden Varianten ansieht, dann hat die Variante ohne const deutlich mehr Anweisungen als die mit.
Experten können dazu sicherlich mehr sagen, ich meine mich zu erinnern dass das mit der Referenzzählung und der Änderungsüberwachung zusammenhängt.
Ändert sich nichts innerhalb der Prozedur, sollte man also immer const verwenden.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Prüfen ob String bestimmte Werte enthält

Beitrag von mse »

m.fuchs hat geschrieben: ich meine mich zu erinnern dass das mit der Referenzzählung und der Änderungsüberwachung zusammenhängt.
Ändert sich nichts innerhalb der Prozedur, sollte man also immer const verwenden.

Ohne "const" wird bei der Parameterübergabe ein incref() ausgeführt und beim Abräumen ein decref(). Wenn man "const" angibt darf der string aber wirklich nicht verädert werden, auch nicht über Umwege z.B. als globale Variable oder einem Ausgabeparameter, sonst können Memory-Fehler auftreten.

Antworten