Regexpr

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Regexpr

Beitrag von hum4n0id3 »

Hi,

ich beschäftige im Moment mit den Regular Expressions unter Lazarus.

https://wiki.freepascal.org/Regexpr
https://regex.sorokin.engineer/en/lates ... sions.html

Leider bin ich da nicht so fit und brauche einen Tritt in die richtige Richtung. Ich möchte einen String aus Zahlen und Buchstaben von einander Trennen.

Zum Beispiel soll aus 320px -> Wert1 => 320, Wert2 => px werden.

Unter PHP gibt es zum Beispiel preg_split, https://www.php.net/manual/de/function.preg-split.php. Bei Lazarus finde ich nichts wirklich.

Kann mir jemand helfen?

Vielen Dank im Vorraus

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Regexpr

Beitrag von Socke »

Du musst immer ein TRegExpr-Objekt erstellen (Beispiele siehe Wiki) und kannst darüber die gefundenen Elemente finden. Wenn du einfach eine Liste haben willst, ist die Methode TRegExpr.Split dein Freund. Über die Eigenschaft Match[] kannst du die Subexpressions auch direkt abfragen.

Reguläre Ausdrücke probiere ich überwiegend online per regex101.com, da die Auswertung echt gut visualisiert wird.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Regexpr

Beitrag von sstvmaster »

So zum Beispiel:

Code: Alles auswählen

 
...
uses RegExpr
...
 
procedure TForm1.Button1Click(Sender: TObject);
var
  re: TRegExpr;
  i: Integer;
  ReOut: String;
begin
  Memo1.Clear;
 
  if (Edit1.Text = '') or (Edit2.Text = '') then begin
    Memo1.Lines.Add('Error: String or Expression emtpy');
    Exit;
  end;
 
  ReOut := 'Group %d. -> Pos:%d, Len:%d -> %s';
 
  re := TRegExpr.Create;
  try
    try
      re.Expression := '(\d*)(\S*)';
      //re.Expression := Edit2.Text;
 
      if re.Exec('320px') then begin
      //if re.Exec(Edit1.Text) then begin
 
        // Full Match at 0 (Zero)
        Memo1.Lines.Add( Format(ReOut, [0, re.MatchPos[0], re.MatchLen[0], re.Match[0]]) );
 
        // Sub Matches
        for i:=1 to re.SubExprMatchCount do begin
          Memo1.Lines.Add( Format(ReOut, [i, re.MatchPos[i], re.MatchLen[i], re.Match[i]]) );
        end;
 
      end;
    except
      On E:Exception do begin
        Memo1.Lines.Add(E.Message);
      end;
    end;
 
  finally
    re.Free;
  end;
 
end;
 
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: Regexpr

Beitrag von hum4n0id3 »

Hi,

danke euch beiden! Habe es mit eurer Hilfe lösen können :)

mfg

Antworten