Mal wieder ein Regex :)
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
alpha
code
dank
durchsuchen
eckigen klammern
einzelne vorkommen
erfahrung
ergebnis
ersetzen
funktionieren
hintere teil
match
moment
problem
schema
set
sog
sonstigen dingen
string
zahl
-
Hiho,
lang ists her, aber ich habe mal wieder eine Frage zu einem Regex :) Und zwar geht's um folgenden String:
|cffa335ee|Hitem:71805:0:0:0:0:0:0:1070949632:85:0 |h[Königinnengranat]|h|r|cffa335ee|Hitem:71809:0:0:0:0:0:0:830766720:8 5:0|h[Schattenspinell]|h|r
Es handelt sich hier um zwei WoW-Gegenstände als sog. "Itemstring". Der Aufbau ist eigentlich immer der Selbe:
|YYY|HXXX:ZZZ|h[XXX]|h|r YYY = 9-Stelliger Farbcode ZZZ = Ausschließlich eine Zahl
Ich möchte nun einen String nach genau diesem Schema durchsuchen und jedes einzelne Vorkommen ersetzen. Problem ist halt, dass mir im Moment der passende Regex fehlt.
Beitrag zuletzt geändert: 17.8.2012 20:23:43 von fabo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
ich hab mal ein bisschen gebastelt und dieser Regex mapt:
\|[a-z0-9]{9}\|Hitem:([0-9]|:)+ \|h\[(\w|&|#|;)*\]\|h\|r
Es mag nicht der schoenste sein, aber funktionieren tut er bei mir (getestet mit tclsh).
Du sagst zwar das ZZZ ausschliesslich eine Zahl ist, aber in dem String besteht ZZZ doch aus Zahlen und Doppelpunkten...so hab ich das jetzt zumindest im Regex abgebildet. Ich hoffe, das hilft dir weiter.
Achja, den hintere Teil in den eckigen Klammern habe ich so gewaehlt, damit er auch bei bei nem greedy Allquantor funktioniert. Wenn deiner nicht greedy ist, kannst du auch "\[.*\] schreiben.
Ich hoffe, ich konnte dir weiterhelfen, habe selber noch nicht soviel Erfahrung mit Regexen, deswegen war das eine gute Uebung ;)
Achja, hier noch mein tcl code:
set line "|cffa335ee|Hitem:71805:0:0:0:0:0:0:1070949632:85:0 |h\[Königinnengranat\]|h|r|cffa335ee|Hitem:71809:0:0:0:0:0:0:830766720:8 5:0|h\[Schattenspinell\]|h|r" if {[regexp {\|[a-z0-9]{9}\|Hitem:([0-9]|:)+ \|h\[(\w|&|#|;)*\]\|h\|r} $line match] == 1} { puts "match: $match " } else {puts "no match"}
-
Hi,
danke für deine Antwort. Ich habe mir das Ganze noch einmal angesehen und bin bisher bei diesem Ergebnis:
~\|([[:xdigit:]]{9})\|H([[:alpha:]]+):([[:digit:]]+)(?:\:.*)?\|(?:[[:space:]])?h\[(.*)\]\|h\|r~U
Problem ist, dass es manchmal nicht funktioniert aufgrund eines Leerzeichens oder sonstigen Dingen. Daher auch die space-Funktion mittendrin :D -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage