Nachbildung von preg_match() funktioniert nicht wie beabsich

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Domino
Beiträge: 22
Registriert: 21.12.2015 21:28
Computerausstattung: Centrino 2x2GHz, GeForce Graka
Linux 3.16

Nachbildung von preg_match() funktioniert nicht wie beabsich

Beitrag von Domino »

Hallo!

PHPs preg_match() möchte ich aus Gründen der Praktikabilität nachbilden und kam bisher zu einem Quältext, dessen wesentlichen Teil (selbst lauffähig) ich hier wiedergebe:

Code: Alles auswählen

Dim Teile.s(30)
Dim Auflosung.s(30)
Declare.l PregMatch(Pattern.s, String.s, Array Arr.s(1))
i = 1
Teile(1) = "640x352 [SAR 16:11 DAR 320:121]"

PregMatch("([\d]+)\w([\d]+)", Teile(i), Auflosung())
PregMatch("(\d+)x(\d+)(\s.*)?", Teile(i), Auflosung())
PregMatch("(\d+)x(\d+)(\s+\[(SAR\s+[\d+]:[\d+])?(\s+DAR\s+[\d+]:[\d+])?\])?", Teile(i), Auflosung())

Procedure.l PregMatch(Pattern.s, String.s, Array Arr.s(1))
  Define Erg.l
  Erg = CreateRegularExpression(0, Pattern)
  Debug "PregMatch(): Erg1="+Erg
  If Erg
    Erg = ExtractRegularExpression(0, String, Arr())
    Debug "PregMatch(): Erg2="+Erg
    FreeRegularExpression(0)
  EndIf
  For i=0 To ArraySize(Arr()) : Debug "Arr("+i+")="+Chr(34)+Arr(i)+Chr(34) : Next i
  Debug ""
  ProcedureReturn Erg
EndProcedure
Die dritte Zeile mit dem Funktionsaufruf möchte ich sauber abgearbeitet haben; die beiden vorherigen sind nur Vereinfachungen zur Fehlereingrenzung. Der zu untersuchende Text (hier: "Teile(i)") stammt von einem Videobearbeitungsprogramm. Leider wird den Platzhalter \d soviel Text zugewiesen, wie es nur geht und dabei wird auch das x mit aufgenommen. Weiß jemand Rat? Danke!

Gruß
Domino
Centrino 2x2GHz, GeForce Graka, mehrere Linux Mint u.a. mit Mate, Linux 3.16
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Nachbildung von preg_match() funktioniert nicht wie beab

Beitrag von edel »

ExtractRegularExpression gibt nur den gesamten Text zurueck, moechtest du einen Teilstring auslesen, musst du RegularExpressionGroup bemuehen.

Code: Alles auswählen

Dim Teile.s(30)
Dim Auflosung.s(0)
Declare.l PregMatch(Pattern.s, String.s, Array Arr.s(1))
i = 1
Teile(1) = "640x352 [SAR 16:11 DAR 320:121]"

PregMatch("([\d]+)\D([\d]+)", Teile(i), Auflosung())
PregMatch("(\d+)x(\d+)(\s.*)?", Teile(i), Auflosung())
PregMatch("(\d+)x(\d+)(\s+\[(SAR\s+[\d+]:[\d+])?(\s+DAR\s+[\d+]:[\d+])?\])?", Teile(i), Auflosung())

Procedure.l PregMatch(Pattern.s, String.s, Array Arr.s(1))
  Define Erg.l
  Erg = CreateRegularExpression(0, Pattern)
  Debug "PregMatch(): Erg1="+Erg
  If Erg
    Erg = ExtractRegularExpression(0, String, Arr())
    Debug "PregMatch(): Erg2="+Erg
    
    For i=0 To Erg: 
      Debug "Arr("+i+")="+Chr(34)+Arr(i)+Chr(34) : 
      If ExamineRegularExpression(0, Arr(i))
        While NextRegularExpressionMatch(0)
          Debug RegularExpressionGroup(0, 1) + " - " + RegularExpressionGroup(0, 2)
        Wend      
      EndIf
    Next i
  EndIf
    
  Debug ""
  ProcedureReturn Erg
EndProcedure
Benutzeravatar
Domino
Beiträge: 22
Registriert: 21.12.2015 21:28
Computerausstattung: Centrino 2x2GHz, GeForce Graka
Linux 3.16

Re: Nachbildung von preg_match() funktioniert nicht wie beab

Beitrag von Domino »

Danke vorerst! Noch bekomme ich die Kiste nicht richtig hin, aber ich bleibe dran.

Gruß
Domino
Centrino 2x2GHz, GeForce Graka, mehrere Linux Mint u.a. mit Mate, Linux 3.16
Benutzeravatar
Domino
Beiträge: 22
Registriert: 21.12.2015 21:28
Computerausstattung: Centrino 2x2GHz, GeForce Graka
Linux 3.16

[Gelöst] Re: Nachbildung von preg_match() funktioniert nicht

Beitrag von Domino »

Problem gelöst, Beispielquelltext in Tipps & Codes.
Ergänzung: Link http://www.purebasic.fr/german/viewtopi ... =8&t=29369
Centrino 2x2GHz, GeForce Graka, mehrere Linux Mint u.a. mit Mate, Linux 3.16
Antworten