Seite 2 von 3

Verfasst: 30.09.2008 16:58
von edel
STARGÅTE hat geschrieben:@edel

pass mal deine Abfrage an (zB wie meine), denn sonst bekommt "GroßeVar" auch ein TRUE

EDIT : und große Buchstaben werden bei dir nun auch FALSE
A-Z fehlt noch :wink:
Nein das fehlt nicht ;)

Verfasst: 30.09.2008 17:03
von STARGÅTE
ah stimmt.. wusste nicht das es den FLAG 1 gibt.

Ist dann wahrscheinlich "Modifier i (ignore case)" ....

Verfasst: 30.09.2008 17:19
von edel
Du kannst alle Flags angeben die auch die API aufnimmt, beim erstellen
des Regex. Aber Regex lohnt sich nicht fuer diesen einen Fall.
Wenn schon Regex dann wohl eher gleich einen ganzen Parser.

Re: Gültigen VariablenNamen erkennen.

Verfasst: 30.09.2008 18:15
von Kaeru Gaman
nochmal ein genereller hinweis...
cxAlex hat geschrieben:

Code: Alles auswählen

Macro isValidChar(_Char)
  ; Gültige Zeichen
  ((_Char<58) And (_Char>47)) Or ((_Char<123) And (_Char>96)) Or ((_Char<91) And (_Char>64)) Or _Char = 95
EndMacro
dein Macro versucht, Boole'sche Ausdrücke zu verwenden. Die werden aber in PB nicht unterstützt.

demo:

Code: Alles auswählen

a = 4
b = 5

Debug (a<b)
würde der Boole'sche Ausdruck korrekt ausgewertet, müßte da 1 oder -1 rauskommen.
also solche Konstrukte besser vermeiden.

Verfasst: 30.09.2008 18:16
von Little John
Ich bekomme mit cxAlex' Testcode aus dem Posting von heute um 17:55:31 folgende Zeiten ( bei ausgeschaltetem Debugger ;-) ):

Code: Alles auswählen

cx     3078
ts    18140
regex  2422
(PB 4.20 unter Windows XP).
Hier ist RegEx am schnellsten, komisch.

Gruß, Little John

Verfasst: 30.09.2008 18:58
von ts-soft
Little John hat geschrieben:Ich bekomme mit cxAlex' Testcode aus dem Posting von heute um 17:55:31 folgende Zeiten ( bei ausgeschaltetem Debugger ;-) ):

Code: Alles auswählen

cx     3078
ts    18140
regex  2422
(PB 4.20 unter Windows XP).
Hier ist RegEx am schnellsten, komisch.

Gruß, Little John
Guck Dir mal den Testcode an :lol:
Der dritte Wert ist TS :mrgreen:

Verfasst: 30.09.2008 19:10
von Little John
ts-soft hat geschrieben:Guck Dir mal den Testcode an :lol:
Ich habe mir den Testcode wirklich nicht angekuckt, sondern ihn nur "abgespielt". :lol:
Ich hatte eine Idee wie ich Deinen Code evtl. noch verbessern könnte, aber nach diesem verwirrenden Ergebnis ...

Gruß, Little John

Verfasst: 30.09.2008 19:55
von Little John
Meine Idee war, durch Löschen von Bit 5 praktisch UCase() mit dem ASCII-Wert zu machen. Der Code ist aber nicht schneller (also ist lj > ts :D). Hier trotzdem falls es jemanden interessiert meine Prozedur isValidVariableName4(), und der alte Testcode etwas aufgeräumt und konsistent nummeriert. ;-)

Code: Alles auswählen

#n = 10000000


Global regex = CreateRegularExpression(#PB_Any,"[a-z_][a-z0-9_]*",1)

Procedure isValidVariableName1(Var.s)
  If MatchRegularExpression(regex,Var)
    ProcedureReturn #True
  EndIf   
EndProcedure


Macro isValidChar(_Char)
  ; Gültige Zeichen
  ((_Char<58) And (_Char>47)) Or ((_Char<123) And (_Char>96)) Or ((_Char<91) And (_Char>64)) Or _Char = 95
EndMacro

Procedure isValidVariableName2(*VarMem.Character)
  If *VarMem\c<58 And *VarMem\c>47 ; Keine Zahlen am Anfang
    ProcedureReturn 0
  EndIf
  While *VarMem\c
    If Not isValidChar(*VarMem\c) ; Jedes Zeichen prüfen.
      ProcedureReturn 0
    EndIf
    *VarMem + 1
  Wend
  ProcedureReturn 1 ; Variable ist ok
EndProcedure


Procedure isValidVariableName3(*VarMem.Character)
  If *VarMem\c < 58 And *VarMem\c > 47 ; Keine Zahlen am Anfang
    ProcedureReturn 0
  EndIf
  While *VarMem\c
      Select *VarMem\c
        Case 48 To 57, 65 To 90, 97 To 122, 95
        Default
          ProcedureReturn 0
      EndSelect
    *VarMem + 1
  Wend
  ProcedureReturn 1 ; Variable ist ok
EndProcedure


Procedure isValidVariableName4(*VarMem.Character)
   If *VarMem\c >= '0' And *VarMem\c <= '9'   ; Keine Zahlen am Anfang
      ProcedureReturn 0
   EndIf
   While *VarMem\c
      Select *VarMem\c
         Case '0' To '9', '_'
         Default
            Select *VarMem\c & $DF   ; Bit 5 löschen = UCase()
               Case 'A' To 'Z'
               Default
                  ProcedureReturn 0
            EndSelect     
      EndSelect
      *VarMem + 1
   Wend
   ProcedureReturn 1      ; Variable ist ok
EndProcedure


t1 = ElapsedMilliseconds()
For i = 1 To #n
  isValidVariableName1("_char1")
  isValidVariableName1("0invlaid")
  isValidVariableName1("sehrlangername")
Next
t1 = ElapsedMilliseconds() - t1

t2 = ElapsedMilliseconds()
For i = 1 To #n
  isValidVariableName2(@"_char1")
  isValidVariableName2(@"0invlaid")
  isValidVariableName2(@"sehrlangername")
Next
t2 = ElapsedMilliseconds() - t2

t3 = ElapsedMilliseconds()
For i = 1 To #n
  isValidVariableName3(@"_char1")
  isValidVariableName3(@"0invlaid")
  isValidVariableName3(@"sehrlangername")
Next
t3 = ElapsedMilliseconds() - t3

t4 = ElapsedMilliseconds()
For i = 1 To #n
  isValidVariableName4(@"_char1")
  isValidVariableName4(@"0invlaid")
  isValidVariableName4(@"sehrlangername")
Next
t4 = ElapsedMilliseconds() - t4

MessageRequester("", "regex "+Str(t1)+#LF$ + "cx "+Str(t2)+#LF$ + "ts "+Str(t3)+#LF$ + "lj "+Str(t4))
Gruß, Little John

Re: Gültigen VariablenNamen erkennen.

Verfasst: 30.09.2008 23:39
von STARGÅTE
Kaeru Gaman hat geschrieben: demo:

Code: Alles auswählen

a = 4
b = 5

Debug (a<b)
würde der Boole'sche Ausdruck korrekt ausgewertet, müßte da 1 oder -1 rauskommen.
also solche Konstrukte besser vermeiden.
Meiner Meinung nach muss man es nur "Richtig" anwenden:

Code: Alles auswählen

a = 4 
b = 5 

Debug ( (a<b) And 1 )
Debug ( (a>b) And 1 )
macht man das immer so, erhält man 100% TRUE oder FALSE und kann dann damit auch Rechnen ...

Verfasst: 01.10.2008 01:17
von Kaeru Gaman
den Tipp hast du doch von mir, Scherzkeks. ;)

... davon ab, ist das ein "hack" oder "dirty workaround", ohne anspruch oder garantie auf funktionalität.
dazu hat sich mit 4.3 etwas an der verarbeitung der pseudo-boole'schen ausdrücke geändert,
also kann ich dir jetzt nicht sagen, ob der alte häck noch funktioniert.

grundsätzlich, egal ob der häck noch funktioniert oder nicht, ist das Macro wie es vorliegt falsch,
die idee dahinter geht von falschen voraussetzungen aus, und das musste aufgeklärt werden.
auch wenn er jetzt sowieso eine andere lösung wählt, muss er wissen, dass er so konstrukte vermeiden sollte.