String mit regulärem Ausdruck splitten?

Anfängerfragen zum Programmieren mit PureBasic.
mestnyi
Beiträge: 15
Registriert: 25.02.2014 22:00

Re: String mit regulärem Ausdruck splitten?

Beitrag von mestnyi »

im englischen forum war vor kurzem eine aehnliche frage, da wollte jemand sowas parsen (leerzeichen-getrennte liste aus [geschachtelten] funtionsaufrufen) :
Nicht jemand aber selbst mestnyi.
Vielleicht war ich zu spät, ich war weg.
mit einem regulären Ausdruck:

Code: Alles auswählen

EnableExplicit

Enumeration RegularExpression
  #RegEx_Function
  #RegEx_Arguments
EndEnumeration

#RegEx_Pattern_Function = ~"(?:(\\w*)\\s*\\(((?>[^()]|(?R))*)\\))"
#RegEx_Pattern_Arguments = ~"((?:(?:(;).*|\".*?\"|(\\().*?\\))|\\s*\\=\\s*|[^,\\s])+)"

Define Create_Reg_Flag = #PB_RegularExpression_NoCase | #PB_RegularExpression_MultiLine | #PB_RegularExpression_Extended| #PB_RegularExpression_DotAll    

If CreateRegularExpression(#RegEx_Function, #RegEx_Pattern_Function, Create_Reg_Flag) And
   CreateRegularExpression(#RegEx_Arguments, #RegEx_Pattern_Arguments, Create_Reg_Flag)
EndIf

Procedure.s Extract(String$)
   
  With *This
    If ExamineRegularExpression(#RegEx_Function, String$)
      While NextRegularExpressionMatch(#RegEx_Function)
        String$ = Trim(RegularExpressionGroup(#RegEx_Function, 2))
        
        If ExamineRegularExpression(#RegEx_Arguments, String$)
          While NextRegularExpressionMatch(#RegEx_Arguments)
            Debug RegularExpressionMatchString(#RegEx_Arguments)
          Wend
        EndIf
        
      Wend
    EndIf
  EndWith
  
EndProcedure

;Extract(~"ProcedureDLL myProcedure(p1, p2, p3.s = \"4,2\") ; just a comment, one, two, three")
;Extract(~"ProcedureDLL myProcedure(p1, p2, p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
;Extract(~"ProcedureDLL myProcedure(p1, p2 = 3.14, p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
Extract(~"ProcedureDLL myProcedure(p1, p2 = GetString(\"3,14\", \"Test\", 42), p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")

Code: Alles auswählen

EnableExplicit

Enumeration RegularExpression
  #RegEx_Function
  #RegEx_Arguments
EndEnumeration

#RegEx_Pattern_Function = ~"(?:(\\w*)\\s*\\(((?>[^()]|(?R))*)\\))"
#RegEx_Pattern_Arguments = "("+#RegEx_Pattern_Function+~"|\".*?\"|\\w*\\.*\\w*\\s*\\=*\\s*\\w*)+"

Define Create_Reg_Flag = #PB_RegularExpression_NoCase | #PB_RegularExpression_MultiLine | #PB_RegularExpression_Extended| #PB_RegularExpression_DotAll    

If CreateRegularExpression(#RegEx_Function, #RegEx_Pattern_Function, Create_Reg_Flag) And
   CreateRegularExpression(#RegEx_Arguments, #RegEx_Pattern_Arguments, Create_Reg_Flag)
EndIf

Procedure.s Extract(String$)
  Protected Result$, ID, Index, Value.f, Param1, Param2, Param3, Param1$
  Protected operand$, val$
  
  With *This
    If ExamineRegularExpression(#RegEx_Function, String$)
      While NextRegularExpressionMatch(#RegEx_Function)
        String$ = Trim(RegularExpressionGroup(#RegEx_Function, 2))
        
        If ExamineRegularExpression(#RegEx_Arguments, String$)
          While NextRegularExpressionMatch(#RegEx_Arguments)
            If RegularExpressionMatchString(#RegEx_Arguments)
              Debug Trim(RegularExpressionMatchString(#RegEx_Arguments))
            EndIf
          Wend
        EndIf
        
      Wend
    EndIf
  EndWith
  
  ProcedureReturn Result$
EndProcedure

;Extract(~"ProcedureDLL myProcedure(p1, p2, p3.s = \"4,2\") ; just a comment, one, two, three")
;Extract(~"ProcedureDLL myProcedure(p1, p2, p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
;Extract(~"ProcedureDLL myProcedure(p1, p2 = 3.14, p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
Extract(~"ProcedureDLL myProcedure(p1, p2 = GetString(\"3,14\", a(b(),c()), 42), p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: String mit regulärem Ausdruck splitten?

Beitrag von Nino »

Bevor hier noch mehr über Reguläre Ausdrücke gepostet wird ... :mrgreen:

Die Aufgabenstellung von Kiffi ist ein gutes Beispiel für Probleme, die mit Code ohne Reguläre Ausdrücke besser gelöst werden können. Kurzer hat das ja sehr schön demonstriert.
Antworten