Gültigen VariablenNamen erkennen.

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 ;)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ah stimmt.. wusste nicht das es den FLAG 1 gibt.

Ist dann wahrscheinlich "Modifier i (ignore case)" ....
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Gültigen VariablenNamen erkennen.

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Little John

Beitrag 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
Little John

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Gültigen VariablenNamen erkennen.

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten