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ć?
Edit i stały ciąg znaków
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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
- Rejestracja: dni
- Ostatnio: dni
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ść.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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.