Edit i stały ciąg znaków

0

Chciałbym za pomocą buttona sprawdzić czy w edit wprowadzone są odpowiednie wartości tj. początek musi zaczynać się od '!ZKd.' po czym powinny być dwie dowolne cyfry, po nich kropka i dowolny ciąg liter gdzie dwie pierwsze muszą być duże a reszta małe. Dodatkowo chciałbym by po kliknięciu buttona do zmiennej typu string zapisywał się ten ostatni ciąg liter.
Z czego w takim przypadku powinienem skorzystać?

0

Z wyrażeń regularnych.

0

Już któryś raz podchodzę do tego tematu i nadal bez skutków.
Już nawet ograniczyłem się do weryfikacji wpisanego ciągu znaków tak by przyciskiem button wyciągnąć z Edita tekst po dziewiątym znaku jednak nadal nic nie wychodzi.
Mógłby ktoś napisać coś więcej niż to co napisał kolega furious programming?
Jakiś link do poradnika który mówi konkretnie o usuwaniu znaków bądź wyciąganiu znaków od konkretnej pozycji, albo coś podobnego?
Jak czytam o samych wyrażeniach regularnych to za nic nie rozumiem ich zastosowania w praktyce...

EDIT1: Znalazłem na tym forum coś takiego:

 var
  s : string;
begin
  s := Edit1.Text;
  Delete(s, pos('tekst', s), length('ten sam tekst'));
  Edit1.Text := s;
end;

Jednakże chciałbym pos('tekst', s) zmienić na informację od którego znaku ma kopiować tekst.

EDIT2: Dobra udało mi się coś wymodzić, jednak mimo, że takie coś mi wystarczy jest to raczej błędne:

 var
  s : string;
  i : integer;
begin
  s := edit1.text;
  for i := 0 to length(s) do
  begin
    delete(s, pos('!ABC', s), 4);
    delete(s, pos('0', s), 1);
    delete(s, pos('1', s), 1);
    delete(s, pos('2', s), 1);
    delete(s, pos('3', s), 1);
    delete(s, pos('4', s), 1);
    delete(s, pos('5', s), 1);
    delete(s, pos('6', s), 1);
    delete(s, pos('7', s), 1);
    delete(s, pos('8', s), 1);
    delete(s, pos('9', s), 1);
    delete(s, pos('.', s), 1);
  end;
  edit1.text := s;
end;

Poza tym w takim rozwiązaniu brakuje mi sprawdzenia czy tekst w Edit1 znaczyna się od !ABC nim usunie.

0

Mam nieodparte wrażenie, że wytrwale dążąc do wycięcia docelowego ciągu znaków nie bierzesz pod uwagę, że coś może być źle. Np użytkownik wpisał tylko trzy znaki i kliknął na przycisk.

0

Masz rację aczkolwiek najpierw chcę zrozumieć jeden temat by przejść do kolejnego problemu :)
Poza tym w tym przypadku zrobię po prostu Length(Edit.Text) > 9 i tyle

0
Zeelof napisał(a):

Poza tym w takim rozwiązaniu brakuje mi sprawdzenia czy tekst w Edit1 znaczyna się od !ABC nim usunie.

Możesz to zrobić tak:

  1. Sprawdź czy długość łańcucha (string) w Edit jest odpowiednia, to znaczy nie krótsza od 4 znaków.
    A). Jeżeli nie jest - odczytaj 4 pierwsze znaki i porównaj je z poszukiwanym przez Ciebie wzorem.
    B). Jeżeli jest - wyświetl komunikat błędu czy co tam przewidujesz na taką okoliczność.
0
Crow napisał(a):

A). Jeżeli nie jest - odczytaj 4 pierwsze znaki i porównaj je z poszukiwanym przez Ciebie wzorem.

I właśnie z tym mam problem. Nie wiem jak odczytać konkretne znaki.

0
Zeelof napisał(a):
Crow napisał(a):

A). Jeżeli nie jest - odczytaj 4 pierwsze znaki i porównaj je z poszukiwanym przez Ciebie wzorem.

I właśnie z tym mam problem. Nie wiem jak odczytać konkretne znaki.

Copy

1

Jeśli chcesz odczytać pojedyńczy znak:

edit1.text[2]

Jeśli kilka z ciągu, to np. jak wyżej, za pomocą funkcji Copy.

0

Wyrażenia regularne nadają się do tego celu bardzo dobrze - nie jestem ekspertem ale takie coś powinno załatwić sprawę:

 program Dopasowanie;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils, RegularExpressions;

var
  RegEx: TRegEx;
  Match: TMatch;
  s: string;
begin
  RegEx.Create('^(?:!ZKd\.[0-9]{2}\.[A-Z]{2}([a-z]+))$');

  while True do
  begin
    Write('Podaj ciąg: ');
    ReadLn(s);

    if RegEx.IsMatch(s) then
    begin
      Match := RegEx.Match(s);
      WriteLn('Odczytany string: ', Match.Groups[1].Value);
    end
    else
      Writeln('Brak dopasowania');

  end;
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0