RegExp .. brauche hilfe^^

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

RegExp .. brauche hilfe^^

Beitrag von EugenE »

Also ich habe diesen String:

y=mx+b bzw dieses beispiel
y=123x+456

daraus will ich die 123 und die 456 auslesen

um die 123 auszulesen habe ich das benutzt

Code: Alles auswählen

[0-9]+[a-z]


aber für die 456 bekomme ich einfach keinen richtigen code

oder kann man das mit einer anderen componente/unit besser realisieren?^^

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

das musst du schon mitm parser machen wenn die therme komplexer werden können ...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: RegExp .. brauche hilfe^^

Beitrag von theo »

EugenE hat geschrieben:oder kann man das mit einer anderen componente/unit besser realisieren?^^


Man muss ja nicht gleich mit Kanonen auf Spatzen schiessen ;-)

Geh doch einfach durch die Chars, die Nummern sammelst du, wenn das x Kommt ist Zahl eins fertig. Dann geh weiter bis wieder ne Nummer kommt, wenn der String zuende ist, ist Zahl zwei fertig. (Oder so ;-)

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

hm ja so könnte man es machen wenn man es auch nur so eingeben würde

y=mx+b aber was ist wenn man y=b+mx oder so?^^

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

EugenE hat geschrieben:hm ja so könnte man es machen wenn man es auch nur so eingeben würde

y=mx+b aber was ist wenn man y=b+mx oder so?^^


Naja, auf eine Regel musst du dich schon festlegen, auch mit RegEx.

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

mit regex " [0-9]+[a-z]" kann ich in beiden formen

- y=mx+b
- y=b+mx

den Wert m rausbekommen aber für b fällt mir irgendwie nichts ein hm

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ich benutze dazu oft meinen "Allzweck-Tokenizer".
Mit der Demo unten kriegst du schon mal nur die Zahlen raus, egal was sonst noch kommt. Den Code bei Button1Click und die TokenChars musst du vielleicht noch anpassen.

Code: Alles auswählen

const TokenChars=['0'..'9'];
 
function Tokenize(S: string; var pos: integer; var isTokenChar:Boolean): string;
var
  Len, Start: integer;
begin
  Len := length(S);
  if pos = 0 then pos := 1 else
    if pos > Len then pos := -1;
 
  if Len > 0 then
  begin
    if not (S[pos] in TokenChars) then
    begin
      Result := S[pos];
      inc(pos);
      isTokenChar:=True;
    end
    else
    begin
     Start:=pos;
     repeat
        inc(pos);
     until (pos > Len) or not (S[pos] in TokenChars);
     isTokenChar:=False;
     Result:=Copy(S,Start,Pos-Start);
    end;
    if pos > Len then pos := 0;
  end else
  begin
  isTokenChar:=False;
  Result := '';
  pos := 0;
  end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var isTC:boolean;
Pos:integer;
Token:String;
begin
  pos:=0;
  repeat
   Token:=Tokenize(Edit1.text, pos, IsTC);
  if not isTC then
    begin
      Memo1.lines.add(Token);
    end;
  until pos<=0;
end;

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: RegExp .. brauche hilfe^^

Beitrag von Euklid »

theo hat geschrieben:
EugenE hat geschrieben:Geh doch einfach durch die Chars, die Nummern sammelst du, wenn das x Kommt ist Zahl eins fertig. Dann geh weiter bis wieder ne Nummer kommt, wenn der String zuende ist, ist Zahl zwei fertig. (Oder so ;-)


Oder lese alle Zahlen aus dem String aus und unterscheide sie, wenn ein Operator (+,-,...) dazwischen liegt.

Bei verschachtelten Termen wirst du um einen Parser nicht drumrum kommen...

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

So habe angefangen mit einem Parser , bisjez nur mit den Klammern und das macht schon probleme

Bei

Code: Alles auswählen

Parse('(4(6))',Ausgabe);

kommt 4(6) raus

hier die procedure

Code: Alles auswählen

procedure TForm1.Parse(SString: String; var Output : String);
var
   tempPos1, tempPos2: Integer;
   tempString1, tempString2 : String;
begin
   if ( (AnsiPos('(', SString) <> 0) AND (AnsiPos(')',SString) <> 0) ) then
   begin
       tempPos1 := AnsiPos('(', SString);
       tempPos2 := AnsiPos(')', SString);
       tempString1 := AnsiMidStr(SString,tempPos1+1,tempPos2-tempPos1-1);
       Parse(tempString1, tempString2);
       //ShowMessage(tempString2);
       SString := AnsiReplaceText(SString,'('+tempString1+')',tempString2);
   end;
   Output := SString;
end;


Wie kann man erst die von außen , dann die von innen stehenden Klammern auslesen , also deren position jetzt?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6214
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

a) Die erste schliessende Klammer suchen
b) von dort aus die öfnnende suchen.

c) nächste schliesssnede
d) nächste öffnende

....

Der Trick ist, die schliessenden nach rechts, die öffnenden nach links zu suchen. Zähl aber am Anfang mal nach ob die Anzahl öffnender = schliessender, sonst kanst du gleich abbrechen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Ja wie kann man von rechts die position bekommen?

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

EugenE hat geschrieben:Ja wie kann man von rechts die position bekommen?


Kannst du mal sagen, worauf du eigentlich hinaus willst?

Der Tokenizer den ich dir geschickt habe könnte schon gute Dienste leisten.
Statt der Rekursion die du eingeführt hast, würde ich mir einen eigenen Stack halten, das ist übersichtlicher.
Rekursionen können zu Kopfschmerzen führen ;-) http://de.wikipedia.org/wiki/Rekursion

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Es gibt 100derte parser also sowas zu schreiben is nu wirklich unsinnig
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Christian hat geschrieben:Es gibt 100derte parser also sowas zu schreiben is nu wirklich unsinnig


Gibt es eigentlich quelloffene Pascal-Parser?

Einen dieser 100derte Parser hab ich für Lexart geschrieben. Die Programmierung hat mir Spaß gemacht - man kann da wirklich viel lernen. Gerade Leuten, die sich für Rekursion oder für die Analyse mathematischer Terme interessieren, möchte ich das empfehlen.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Euklid hat geschrieben:Gibt es eigentlich quelloffene Pascal-Parser?


Zwei mal scharf nachgedacht..... Hmm mal kucken in /fpcsrc/compiler ;-)

Antworten