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ć?
Z wyrażeń regularnych.
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.
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.
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
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:
- 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ść.
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.
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.
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.
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.