Suche den Text zwischen zwei Klammern

Anfängerfragen zum Programmieren mit PureBasic.
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 »

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:
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
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Suche den Text zwischen zwei Klammern

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Suche den Text zwischen zwei Klammern

Beitrag 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
a²+b²=mc²
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 »

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
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
KeyPusher
Beiträge: 52
Registriert: 04.10.2006 10:56

Beitrag 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 ;-)
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag 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:
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Suche den Text zwischen zwei Klammern

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

In der Kürze...

Code: Alles auswählen

Debug StringField(StringField(a$, 2, "("), 1, ")")
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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! :|
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

und welche der hier gezeigten Mini-Lösungen macht das dann richtig ? :roll:
Antworten