Prüfen ob String bestimmte Werte enthält

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Prüfen ob String bestimmte Werte enthält

Beitragvon HonkXL » 15. Feb 2018, 15:46 Prüfen ob String bestimmte Werte enthält

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
HonkXL
 
Beiträge: 1
Registriert: 2. Jan 2015, 10:51

Beitragvon relocate » 15. Feb 2018, 15:55 Re: Prüfen ob String bestimmte Werte enthält

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
relocate
 
Beiträge: 43
Registriert: 24. Jan 2012, 11:47
OS, Lazarus, FPC: Win (L- FPC 2.4.4) | 
CPU-Target: 32Bit
Nach oben

Beitragvon siro » 15. Feb 2018, 16:20 Re: Prüfen ob String bestimmte Werte enthält

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...
siro
 
Beiträge: 290
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 15. Feb 2018, 17:00 Re: Prüfen ob String bestimmte Werte enthält

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
m.fuchs
 
Beiträge: 1925
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Warf » 15. Feb 2018, 17:21 Re: Prüfen ob String bestimmte Werte enthält

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;
Warf
 
Beiträge: 794
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon siro » 15. Feb 2018, 20:06 Re: Prüfen ob String bestimmte Werte enthält

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...
siro
 
Beiträge: 290
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 15. Feb 2018, 22:19 Re: Prüfen ob String bestimmte Werte enthält

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
Warf
 
Beiträge: 794
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon m.fuchs » 15. Feb 2018, 22:49 Re: Prüfen ob String bestimmte Werte enthält

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
m.fuchs
 
Beiträge: 1925
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon mse » 16. Feb 2018, 08:06 Re: Prüfen ob String bestimmte Werte enthält

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.
mse
 
Beiträge: 1900
Registriert: 16. Okt 2008, 09: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
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried