Entschuldige, hab nur den Fettsack (Avatar) gesehenMVXA hat geschrieben:Wieso ich, das ist nicht mal mein Codestil o_O. Dachte du kennst mich besser.
Suche den Text zwischen zwei Klammern
- 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Suche den Text zwischen zwei Klammern
Ich würde es so machen.ComputerFreak_PB hat geschrieben:Ich habe einen Text: z.B.: Text(Hallo) . Jetzt möchte ich zurückgegeben haben, was zwischen den Klammern steht.
Code: Alles auswählen
a$="(Hallo)"
Debug Mid(a$,2,Len(a$)-2)Re: Suche den Text zwischen zwei Klammern
und hier noch 'ne Möglichkeit:
(benötigt die RegExp-Lib von FloHimself)
@edel:
> edel : 2422 ms.
Zeigen!
Grüße ... Kiffi
Code: Alles auswählen
*Reg = RegComp ("\((.*)\)")
RegExec(*Reg, "Test(Hallo)")
TextInKlammern$ = Space(500)
RegSub(*Reg, "\1", TextInKlammern$)
Debug TextInKlammern$@edel:
> edel : 2422 ms.
Zeigen!
Grüße ... Kiffi
a²+b²=mc²
- 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
Der Testcode von edel:
Er ist wohl gerade beschäftigt 
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)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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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 ;-)
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 ;-)
So, hier jetzt ne methode die 100% ist. Text kann an jeder beliebigen stelle beginnen.
BTW:
Speed nicht getestet.
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$)Speed nicht getestet.
Re: Suche den Text zwischen zwei Klammern
Versuch damit mal text wie "(test)(text)"Kiffi hat geschrieben:und hier noch 'ne Möglichkeit:
(benötigt die RegExp-Lib von FloHimself)Code: Alles auswählen
*Reg = RegComp ("\((.*)\)") RegExec(*Reg, "Test(Hallo)") TextInKlammern$ = Space(500) RegSub(*Reg, "\1", TextInKlammern$) Debug TextInKlammern$
@edel:
> edel : 2422 ms.
Zeigen!
Grüße ... Kiffi
richtig muesste es "\((.*?)\)" lauten , wird aber leider nicht unterstuetzt.
- HeX0R
- Beiträge: 3055
- 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:
In der Kürze...
Code: Alles auswählen
Debug StringField(StringField(a$, 2, "("), 1, ")")
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!
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