Seite 2 von 3

Verfasst: 16.10.2006 20:50
von ts-soft
MVXA hat geschrieben:Wieso ich, das ist nicht mal mein Codestil o_O. Dachte du kennst mich besser :(.
Entschuldige, hab nur den Fettsack (Avatar) gesehen :oops:

Re: Suche den Text zwischen zwei Klammern

Verfasst: 16.10.2006 21:07
von al90
ComputerFreak_PB hat geschrieben:Ich habe einen Text: z.B.: Text(Hallo) . Jetzt möchte ich zurückgegeben haben, was zwischen den Klammern steht.
Ich würde es so machen.

Code: Alles auswählen

a$="(Hallo)"
Debug Mid(a$,2,Len(a$)-2)
Ist allerdings nur sinvoll wenn feststeht, das die erste Klammer ganz am Anfang des Strings steht.

Re: Suche den Text zwischen zwei Klammern

Verfasst: 16.10.2006 21:17
von Kiffi
und hier noch 'ne Möglichkeit:

Code: Alles auswählen

*Reg = RegComp ("\((.*)\)")
RegExec(*Reg, "Test(Hallo)")
TextInKlammern$ = Space(500)       
RegSub(*Reg, "\1", TextInKlammern$)
Debug TextInKlammern$
(benötigt die RegExp-Lib von FloHimself)

@edel:

> edel : 2422 ms.

Zeigen! ;-)

Grüße ... Kiffi

Verfasst: 16.10.2006 21:26
von ts-soft
Der Testcode von edel:

Code: Alles auswählen

Text.s = "bla bli blub (Oh si tacuisset!) lalalala träller, pfeif"

#n = 10000000

TestZeit.l  = ElapsedMilliseconds()
For i=1 To #n
  auf=FindString(Text, "(", 1)
  zu=FindString(Text, ")", auf)
  Text2.s = PeekS(@Text+auf, zu-auf-1)
Next
Zeit1 = ElapsedMilliseconds()-TestZeit

TestZeit.l  = ElapsedMilliseconds()
For i=1 To #n
  Text.s = "Test(Hallo)"
  pos1 = FindString(Text, "(", 1)
  If pos1
    pos2 = FindString(Text, ")", pos1)
    Text2.s = Mid(Text, pos1 + 1, pos2 - pos1 - 1)
  EndIf
Next
Zeit2 = ElapsedMilliseconds()-TestZeit

TestZeit.l  = ElapsedMilliseconds()
For i=1 To #n
  *char.Character = @Text
  
  While *char\c 
    
    Select *char\c
      Case '(' : bo = *char + SizeOf(Character)
      Case ')'  
        If bo
          CompilerIf #PB_Compiler_Unicode
            Text2.s = PeekS(bo,(*char-bo) / SizeOf(Character))  : Break
          CompilerElse
            Text2.s = PeekS(bo,(*char-bo))  : Break
          CompilerEndIf
        EndIf
    EndSelect
    
    *char + SizeOf(Character)
  Wend 
Next
Zeit3 = ElapsedMilliseconds()-TestZeit


MessageRequester("Ergebnis","Es wurden je 10000000 Aufrufe gestartet"+#CRLF$+"AND : "+Str(Zeit1)+" ms."+#CRLF$+"ts-soft: "+Str(Zeit2)+" ms."+#CRLF$+"edel : "+Str(Zeit3)+" ms."+#CRLF$,#PB_MessageRequester_Ok)
Er ist wohl gerade beschäftigt :D

Verfasst: 16.10.2006 21:41
von KeyPusher
das ist erschreckend. bei diesem test beträgt die differenz vom schnellsten zum langsamsten 3,422 sekunden. wenn man das hochrechnet mit einem schleifendurchlauf von 10E12 anstatt von nur 10E06 ...

anderer seits, wenn man nur "einmal" feststellen muss was zwischen den klammern ist, beträgt der unterschied nur noch 342,2 nano sekunden. um das mal in sekunden auszudrücken: 0,000000342 sekunden.

wenn man alle for-next schleifen mal weg lässt, dann sind alle 0ms schnell

soviel zeit wird grad noch sein ;-)

Verfasst: 16.10.2006 21:46
von al90
So, hier jetzt ne methode die 100% ist. Text kann an jeder beliebigen stelle beginnen. :mrgreen:

Code: Alles auswählen

a$="Text(Hallo)"
b$=Mid(a$,FindString(a$,"(",1)+1,FindString(a$,")",1)-FindString(a$,"(",1)-1)
Debug b$
Debug Len(b$)
BTW:
Speed nicht getestet. :lol:

Re: Suche den Text zwischen zwei Klammern

Verfasst: 16.10.2006 21:50
von edel
Kiffi hat geschrieben:und hier noch 'ne Möglichkeit:

Code: Alles auswählen

*Reg = RegComp ("\((.*)\)")
RegExec(*Reg, "Test(Hallo)")
TextInKlammern$ = Space(500)       
RegSub(*Reg, "\1", TextInKlammern$)
Debug TextInKlammern$
(benötigt die RegExp-Lib von FloHimself)

@edel:

> edel : 2422 ms.

Zeigen! ;-)

Grüße ... Kiffi
Versuch damit mal text wie "(test)(text)" :-(

richtig muesste es "\((.*?)\)" lauten , wird aber leider nicht unterstuetzt.

Verfasst: 17.10.2006 12:50
von HeX0R
In der Kürze...

Code: Alles auswählen

Debug StringField(StringField(a$, 2, "("), 1, ")")

Verfasst: 17.10.2006 12:57
von AND51
Raffiniert. Leider kam ich schon vor dir auf die Idee, die ich aber sofort wieder verwerfen musste.

Was ist denn, wenn es mehrere Klamemrn in dem String gibt? Dein einzeiler packt das nicht! :|

Verfasst: 17.10.2006 13:03
von HeX0R
und welche der hier gezeigten Mini-Lösungen macht das dann richtig ? :roll: