ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
587
587
EMPFEHLEN
-
Hallo!
Ich bin am verzweifeln und weiß nicht, ob das überhaupt mit regulären Ausdrücken geht...
Also folgendes:
Ich will in einem Text Platzhalter ersetzen. Ein Platzhalter fängt immer mit "<<" an und hört mit ">>" auf. Das ganze wird mit dem Regulären Ausdruck: "((<<)|(<\|))[^>>|\|>]*((>>)|(\|>))" auch korrekt erkannt.
Nun will ich aber übergeordnete Platzhalter einführen. Diese beginnen mit "<<[[" und enden mit "]]>>". Diese können andere Platzhalter enthalten, diese inneren Platzhalter sollen aber nicht erkannt werden!
Beispieltext:
<<[[Ich bin ein Beispiel <<P1>>, <<P2>> Platzhalter!]]>> <<P3>>, <<P4>>
Bedeutung:
<<[[Ich bin ein Beispiel <<P1>>, <<P2>> Platzhalter!]]>> => Beispiel
<<P1>> => "Platzhalter 1"
<<P2>> => "Platzhalter 2"
<<P3>> => "Platzhalter 3"
<<P4>> => "Platzhalter 4"
Gewünschtes Ergebnis:
Beispiel Platzhalter 3, Platzhalter 4
Bitte nicht über Sinn oder Unsinn streiten, das Beispiel ist total aus dem Zusammenhang gerissen
Das Problem dabei ist, dass er den Platzhalter "<<[[Ich bin ein Beispiel <<P1>>, <<P2>> Platzhalter!]]>>" nicht als solchen erkennt. Das beste Ergebnis bisher (nicht der oben genannte RegEx) lieferte als gefundenes Ergebnis: "<<[[Ich bin ein Beispiel <<P1>>"...
Kann mir jemand sagen, ob meine gewünschte Funktion überhaupt möglich ist? Und eventuell ein wenig helfen? Ich spring gleich aus dem Fenster!
Danke!
mdo
-
Ich habs! Nach noch ein wenig Schweiß und Blut hab ichs raus bekommen! Hier der finale Regex, für alle, die ähnliche Probleme haben:
(((<<\[\[)[^(\[\[|\]\])]*(\]\]>>))|(((<<)|(<\|))[^(>>|\|>|\[\[|\]\])]*((>>)|(\|>))))
MUHAHAHA!
-
14.01.11 15:52 #3
Huhu,
ich weiß du hast eine Lösung, aber hier ein Vorschlag für einen Ausdruck, welcher mir persönlich verständlicher, professioneller und vorallem kürzer erscheint:
Code :1
(<<\[\[.*?\]\]>>)|(<<.*?>>)
Wichtig sind hier 2 Dinge:
1. In der Oder-Verknüpfung überprüft er zuerst den linken Anteil, d.h. hier muss das übergeordnete Tag stehen.
2. Non-greedy Operator ("<<.*?>>" statt "<<.*>>"):
Bsp. <<P1>><<P2>> statt <<P1>><<P2>>Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.
-
Für Alternativen bin ich immer dankbar!
Das mit dem übergeordneten Tag ist mir klar, das ist mir kurz nach dem Verfassen des Threads eingeleuchtet.
Allerdings weiß ich nicht genau was du mit dem ".*?" tun willst!?
"?" bedeutet 0 oder 1 mal das vorangegangene Zeichen
"*" bedeutet 0 oder n mal das vorangegangene Zeichen
"." bedeutet ein "beliebiges" Zeichen
Meiner Logik nach, müsste das "?" also eigentlich unnötig sein, oder?
Das würde auch zu deinem "Bsp" passen:
Ich seh da keinen UnterschiedBsp. <<P1>><<P2>> statt <<P1>><<P2>>
Aber btw:
Es geht ja scheinbar auch um das: "[^(\[\[|\]\])]*" bzw um das "[^(>>|\|>|\[\[|\]\])]*". Das soll bedeuten, dass die Zeichenfolgen [[ oder ]] bzw >> oder |> oder [[ oder ]] im Inneren nicht vorkommen dürfen. Würde man das ignorieren und die alternativen Begin udn Endtags (<| und |>) und auch noch die überflüssige Klammerung, wäre meine Lösung dementsprechend natürlich folgende:
(<<\[\[.*\]\]>>)|(<<.*>>)
Allerdings ist mir der Sinn des "?" immer noch nicht so ganz and er Stelle klar. Wo ist da der Mehrwert?Geändert von mdo (14.01.11 um 16:30 Uhr)
-
14.01.11 16:31 #5
Ich wollte dir den Unterschied mit den fett gedruckten Zeichen klar deutlich machen, anscheinend ist mir das nicht gelungen, tut mir leid

Sagen wir du hast folgende Zeichenfolge: <<P1>>, <<P2>>
Fall1: <<.*>>
Du findest 1 Treffer, da dein String mit << beginnt und mit >> aufhört. Die << und >> dazwischen zählen mit zu den beliebigen Zeichen.
Fall2: <<.*?>>
Du findest 2 Treffer, eben weil .*? "non-greedy" grob zu deutsch "nicht gierig" ist.Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.
-
Aha! Das heißt also, ich könnt "[^(\[\[|\]\])]*" bzw "[^(>>|\|>|\[\[|\]\])]*" einfach mit ".*?" ersetzen?
Also sind folgende Ausdrücke beide hinreichend? (siehe meine Definition vom vorherigen Post)
undCode :1
(<<\[\[[^(\[\[|\]\])]*\]\]>>)|((<<|<\|)[^(>>|\|>|\[\[|\]\])]*(>>|\|>))
Code :1
(<<\[\[.*?\]\]>>)|(<<.*?>>)
Übrigens:
Auf meinem Monitor sehe ich keine fetten Zeichen in deinem Post, aber ich denke mal du meintest damit dann wohl die hier: <<P1>><<P2>>
-
14.01.11 16:57 #7
Ja im Post #3 hatte ich die Zeichen fett gedruckt. Es geht hierbei genau um diese inneren Zeichen.
Ja, allerdings musst du hier noch deine Variante mit |> bedenken, die hatte ich in meinem Ausdruck nicht mit drin, da ich nur auf deinen Beispiel-String eingegangen bin. Ich denke aber das Prinzip ist klar...Aha! Das heißt also, ich könnt "[^(\[\[|\]\])]*" bzw "[^(>>|\|>|\[\[|\]\])]*" einfach mit ".*?" ersetzen?Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.
Ähnliche Themen
-
Reguläre Ausdrücke in VBA
Von Trash im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 06.01.09, 12:43 -
Reguläre Ausdrücke
Von Steusi im Forum Coders TalkAntworten: 4Letzter Beitrag: 11.12.08, 13:01 -
Reguläre Ausdrücke
Von Metha im Forum PHPAntworten: 3Letzter Beitrag: 18.06.06, 14:51 -
Reguläre Ausdrücke
Von matze0815 im Forum PHPAntworten: 6Letzter Beitrag: 02.12.04, 08:58 -
Reguläre Ausdrücke!
Von salo im Forum PHPAntworten: 5Letzter Beitrag: 19.11.04, 12:35





Zitieren
Login





