RegEx: "zero-width positive look-ahead assertion
amolip
- programmiertechnik
Hallo,
immer wenn ich Begriffe wie "zero-width positive look-ahead assertion" lese, läuft mir ein Schauer der Ehrfurcht über den Rücken. Ich bin beeindruckt und sage, richtig so, warum einfach, wenn's auch umständlich geht. Gut, ich könnte auch einfach von einem "positive look-ahead" sprechen, damit wäre alles gesagt, was gesagt werden muss, aber wen könnte ich damit beeindrucken?
Meine Frage, seid ihr auch der Meinung, dass "zero-width" und "assertion" hier so überflüssig wie mein Kropf ist? Oder seht ihr das anders?
Gruß Uwe
P.S. Ich habe die Kategorie Programmiertechnik, weil Regulären Ausdrücke wohl am häufigsten in diesem Kontext angewandt werden.
hi,
immer wenn ich Begriffe wie "zero-width positive look-ahead assertion" lese, läuft mir ein Schauer der Ehrfurcht über den Rücken. Ich bin beeindruckt und sage, richtig so, warum einfach, wenn's auch umständlich geht. Gut, ich könnte auch einfach von einem "positive look-ahead" sprechen, damit wäre alles gesagt, was gesagt werden muss,
zero-width drückt eine bestimmte Eigenschaft aus - ohne diese wäre das Ding nicht exakt spzifiziert.
Und wenn du assertion weglässt, dann fehlt das Substantiv.
Meine Frage, seid ihr auch der Meinung, dass "zero-width" und "assertion" hier so überflüssig wie mein Kropf ist?
Weder noch, und
Oder seht ihr das anders?
Ja.
gruß,
wahsaga
Hallo wahsaga,
zero-width drückt eine bestimmte Eigenschaft aus - ohne diese wäre das Ding nicht exakt spzifiziert.
Und wenn du assertion weglässt, dann fehlt das Substantiv.
Ja, das ist soweit schon richtig, wenn es um die Definition eines bestimmten Syntaxelementes geht. Und dieses Syntaxelement wird dann üblicherweise mit "look-ahead" als eigenständiger Begriff der Terminologie behandelt. Wenn ich mich also über ein bestimmtes Syntaxelement unterhalte, dann verwende ich den entsprechenden Begriff und leiere nicht jedes Mal die komplette Definition herunter – die setze ich als bekannt voraus.
Gruß Uwe
gudn tach!
zero-width drückt eine bestimmte Eigenschaft aus - ohne diese wäre das Ding nicht exakt spzifiziert.
Und wenn du assertion weglässt, dann fehlt das Substantiv.
full ack.
Ja, das ist soweit schon richtig, wenn es um die Definition eines bestimmten Syntaxelementes geht.
um die definition oder die erklaerung. hier im forum bspw. versuche ich auch immer den vollstaendigen begriff zu nutzen, weil er zu einem gewissen grade selbsterklaerend ist, bzw. weil sich's kompliziert anhoert und ein neuling auch den eindruck bekommen _sollte_, dass es nicht ganz so einfach ist, d.h. dass er sich damit ein wenig auseinander setzen muss, bevor er's kapiert.
Und dieses Syntaxelement wird dann üblicherweise mit "look-ahead" als eigenständiger Begriff der Terminologie behandelt. Wenn ich mich also über ein bestimmtes Syntaxelement unterhalte, dann verwende ich den entsprechenden Begriff und leiere nicht jedes Mal die komplette Definition herunter – die setze ich als bekannt voraus.
ja, siehe z.b. perldoc perlre. im deutschen wuerde ich jedoch u.u. bei der definition/erklaerung explizit auf diese abkuerzende sprechweise hindeuten.
btw. im kontext der regexp ist mir zum thema "to match" wieder etwas eingefallen, was ich mal in der wikipedia sagte.
prost
seth
Hallo seth,
ja, siehe z.b. perldoc perlre. im deutschen wuerde ich jedoch u.u. bei der definition/erklaerung explizit auf diese abkuerzende sprechweise hindeuten.
Kommt immer auf die Situation an, wenn ich den Begriff "lookahead" als eigenständigen Terminus verstehe, muss ich ihn nicht zwingend erklären – auf Nachfrage natürlich. Und in einem lehrbuchartigen Text muss der Terminus natürlich definiert sein.
Aber das gilt nicht nur für das Deutsche und die Perl Doku ist ein gutes Beispiel wie man es schlecht machen kann, wie man schlampig mit Begriffen umgeht, wobei das insgesamt im Vergleich zu anderen Texten harmlos ist. Einem "alten Hasen" wird das gar nicht auffallen, ein "Neuling" kann daran scheitern.
Perl Doku Version 1, wo ausschließlich die Form "lookahead" verwendet wird.
Perl Doku Version 2, wo ausschließlich die Form "look-ahead" verwendet wird.
Zunächst wird das Syntaxelement definiert mit : "A zero-width positive look-ahead assertion."
Später wird ohne Erklärung "look-ahead" als eigenständiger Terminus verwendet, Beispiel: "Remember that the look-aheads are zero-width expressions-..."
Ich denke nicht, dass ein Neuling zwischen dem Partizip "look-ahead" in der Definition und dem Substantiv "look-ahead" in der Verwendung als eigenständigem Terminus unterscheiden kann. Die Gefahr ist, dass man in "zero-width positive look-ahead assertion" das Partizip "look-ahead" als Substantiv (grammatikalisch falsch) sieht und dann ergibt dies keinen Sinn. Ich hatte eigentlich damit gerechnet, dass in meinem Ursprungsbeitrag genau dies kritisiert wird, weil ich da ja auch keine Unterscheidung in der Schreibweise mache.
Eine saubere Verwendung wäre beispielsweise "A zero-width positive look ahead assertion" (ohne Bindestrich: to look ahead) und als eigenständiger Terminus, als Substantiv "lookahead".
um die definition oder die erklaerung. hier im forum bspw. versuche ich auch immer den vollstaendigen begriff zu nutzen, weil er zu einem gewissen grade selbsterklaerend ist, bzw. weil sich's kompliziert anhoert und ein neuling auch den eindruck bekommen _sollte_, dass es nicht ganz so einfach ist, d.h. dass er sich damit ein wenig auseinander setzen muss, bevor er's kapiert.
Der Gedanke ist ja an und für sich richtig, nur ist der "Neuling" in der Regel so ganz neu nun auch wieder nicht. Du musst davon ausgehen, dass ihm jede Menge Begriffe wild durch den Kopf schwirren, die er nicht einordnen kann. So musst du eben damit rechnen, dass er "look-ahead" als eigenständigen Begriff sieht. Vielleicht würdest du ihm eher einen Gefallen tun, wenn du irgendwie, wie folgt formulierst: "... eine 'zero-width positive look ahead assertion', als Terminus technicus kurz 'lookahead', ...
Ich selber würde einfach nur "lookahead" bzw. in der verdeutschten Form "Lookahead" schreiben, denn es geht in dem Moment nicht um eine Definition, die ja bei Bedarf nachgereicht werden kann.
btw. im kontext der regexp ist mir zum thema "to match" wieder etwas eingefallen, was ich mal in der wikipedia sagte.
Danke für den Link - tja "to match", wenn du wissen willst, was wirkliche Schlamperei ist, dann solltest du mal meine deutschen "Kreationen" sehen, die ich für "to match" verwende ;-)
Um "to match" muss ich mich noch kümmern, erst einmal ist "assertion" dran, das ja deiner Meinung nach "selbsterklärend" ist :-)
Ich bin der Meinung, der Begriff "assertion" hat keinerlei Bedeutung, die über seine eigene triviale Bedeutung hinausgeht. Man könnte ihn daher, ohne dass inhaltlich irgendetwas verloren ginge, durch eine Vielzahl, ebensolcher trivialer Begriffe ersetzen, beispielsweise "expression", "element", "component", "statement" und was weiß ich noch alles.
Kannst du dem zustimmen?
Gruß Uwe
gudn tach!
die Perl Doku ist ein gutes Beispiel wie man es schlecht machen kann, wie man schlampig mit Begriffen umgeht,
oh, naja, also ich habe regexp vor allem mit perldoc perlre gelernt. ich finde den stil prima und verweise auch gerne auf das manual.
Zunächst wird das Syntaxelement definiert mit : "A zero-width positive look-ahead assertion."
Später wird ohne Erklärung "look-ahead" als eigenständiger Terminus verwendet, Beispiel: "Remember that the look-aheads are zero-width expressions-..."Ich denke nicht, dass ein Neuling zwischen dem Partizip "look-ahead" in der Definition und dem Substantiv "look-ahead" in der Verwendung als eigenständigem Terminus unterscheiden kann.
ehrlich gesagt, glaube ich nicht, dass ein neuling das im kontext nicht versteht. anders und etwas provokanter gesagt: zeig mir einen neuling, dem nur perldoc perlre vorgesetzt wird, der an einer stelle nicht versteht, was mit jeweils "look-ahead" gemeint ist.
Die Gefahr ist, dass man in "zero-width positive look-ahead assertion" das Partizip "look-ahead" als Substantiv (grammatikalisch falsch) sieht und dann ergibt dies keinen Sinn. Ich hatte eigentlich damit gerechnet, dass in meinem Ursprungsbeitrag genau dies kritisiert wird, weil ich da ja auch keine Unterscheidung in der Schreibweise mache.
noe, so kleinigkeiten sind imho fuer die informationsuebertragung vernachlaessigbar wenig relevant.
Ich bin der Meinung, der Begriff "assertion" hat keinerlei Bedeutung, die über seine eigene triviale Bedeutung hinausgeht. Man könnte ihn daher, ohne dass inhaltlich irgendetwas verloren ginge, durch eine Vielzahl, ebensolcher trivialer Begriffe ersetzen, beispielsweise "expression", "element", "component", "statement" und was weiß ich noch alles.
Kannst du dem zustimmen?
ja, sehe ich auch so. allerdings wird "assertion" halt i.a.r bei regexps nur in _diesem_ kontext verwendet, weshalb "assertion" auch als eigenstaendiger abkuerzender begriff verwendet werden kann.
prost
seth
Hallo seth,
regexp vor allem mit perldoc perlre gelernt. ich finde den stil prima und verweise auch gerne auf das manual.
Nein, ich will eigentlich nichts gegen perldoc perlre sagen, es ist wirklich gut.
Du kennst vermutlich perldoc perlretut, habe ich den Link nicht sogar von dir? Ich habe es bisher nur überflogen, mein erster – flüchtiger – Eindruck ist, hervorragend.
noe, so kleinigkeiten sind ...
Ich weiß, momentan sehe ich das alles ziemlich kleinkariert, wenn ich die Begriffe erst einmal definiert habe, komm ich schon wieder davon runter ;-)
ja, sehe ich auch so. allerdings wird "assertion" halt i.a.r bei regexps nur in _diesem_ kontext verwendet, weshalb "assertion" auch als eigenstaendiger abkuerzender begriff verwendet werden kann.
Das verstehe ich jetzt nicht, welchen Kontext meinst du – Lookarounds?
Wenn "assertion" als "eigenstaendiger abkuerzender begriff verwendet werden kann", wie definierst du diesen Begriff dann?
Ein häufige Definition, die man findet ist, dass "assertion" der Überbegriff für "zero-width"-Syntaxelemente sei, wie Anchors oder Lookarounds. Diese Definition ist falsch, was ich glaube, logisch begründen zu können. Eine "assertion" kann beispielsweise auch "one-width" sein.
Gruß Uwe
gudn tach Uwe!
ja, sehe ich auch so. allerdings wird "assertion" halt i.a.r bei regexps nur in _diesem_ kontext verwendet, weshalb "assertion" auch als eigenstaendiger abkuerzender begriff verwendet werden kann.
Das verstehe ich jetzt nicht, welchen Kontext meinst du – Lookarounds?
ja.
Wenn "assertion" als "eigenstaendiger abkuerzender begriff verwendet werden kann", wie definierst du diesen Begriff dann?
betonung auf "kann". ich wuerde es nicht tun. aber da bei regexps "assertions" eigentlich nur im kontext von lookarounds verwendet werden, koennte man die worte als synonym bezeichnen.
Ein häufige Definition, die man findet ist, dass "assertion" der Überbegriff für "zero-width"-Syntaxelemente sei, wie Anchors oder Lookarounds.
ja, wobei anchors auch bloss lookarounds sind. "^ looks behind", "$ looks ahead", "\b looks around".
^ ist sowas wie (?<!.)
Diese Definition ist falsch, was ich glaube, logisch begründen zu können. Eine "assertion" kann beispielsweise auch "one-width" sein.
?
prost
seth
gudn tach!
Ein häufige Definition, die man findet ist, dass "assertion" der Überbegriff für "zero-width"-Syntaxelemente sei, wie Anchors oder Lookarounds.
ja, wobei anchors auch bloss lookarounds sind. "^ looks behind", "$ looks ahead", "\b looks around".
^ ist sowas wie (?<!.)Diese Definition ist falsch, was ich glaube, logisch begründen zu können. Eine "assertion" kann beispielsweise auch "one-width" sein.
?
ach soo. meinst du sowas wie /ab/, wobei 'b' eine "one-width positiv look-ahead assertion" ist? *nase_ruempf*
prost
seth
Hallo seth,
zwei bemerkenswerte Sätze finden sich in »perldoc perlre«:
»It's important to realize that a regular expression is merely a set of assertions that gives a definition of success.«
»We can deal with this by using both an assertion and a negation.«
Wobei hier in »(\D*)(?=\d)« das Element »\D*« als "assertion" bezeichnet wird.
Diese zwei Sätze machen deutlich, dass "assertion" in einem viel allgemeineren Sinne verwendet wird, er ist hier nicht in das enge Korsett als "zero-width"-Sprachelement gezwängt.
Ich übersetze "assertion" mit "Aussage". Ob man den Begriff mit "Aussage" oder "Behauptung" oder sonstwie übersetzt ist irrelevant, ich nehme "Aussage". Dies tue ich, um von Vorstellungen, die man mit dem Begriff "assertion" verbindet, wegzukommen. Jetzt müssen wir zunächst nicht groß über den Begriff "Aussage" philosophieren, eine Aussage ist eine Aussage, so wie ein Satz ein Satz ist. Der Begriff hat also zunächst keine tiefere Bedeutung, sondern er steht für sich selbst, er hat keine andere, keine spezifischere Bedeutung als seine eigene, triviale Bedeutung.
Probleme entstehen nun, wenn man einem trivialen Begriff wie "Aussage" eine konkrete Bedeutung zudefiniert. Wenn man ernstzunehmende englischsprachige Texte, wozu ich »perldoc perlre« zähle, liest, dann wird man feststellen, dass der Begriff "assertion" nur in seiner trivialen Bedeutung verwendet wird und ihm darüber hinaus eben gerade keine explizite Bedeutung als "zero-width"-Sprachelement zudefiniert wird. In »perldoc perlre« ist "assertion" einfach nur eine Aussage, ganz banal und trivial. Widersprich mir, wenn du das anders siehst.
Für nicht ernstzunehmende englischsprachige Texte und für alle originär deutschsprachigen Texte, die mir bisher untergekommen sind, gilt: Falls der Begriff "assertion" überhaupt auftaucht, wird er als Überbegriff für "zero-width"-Sprachelemente definiert. Ist das ein Fehler? Nein, das ist kein Fehler! Ich kann ja auch hingehen und festlegen, bei mir heißen "zero-width"-Sprachelemente hinfort "Ützelprützel". Man kann mir dann vorwerfen der Name sei Schwachsinn, aber man kann mir nicht vorwerfen, es sei falsch, wenn ich beim Sprachelement »(?= ... )« von einem "Ützelprützel" spreche.
Falsch wird es erst, wenn ich bei »(?= ... )« von einem "zero-width-Ützelprützel" spreche. Denn ich habe "Ützelprützel" als "zero-width" definiert, "zero-width" ist damit eine immante Eigenschaft von "Ützelprützel". Das ist doppelt gemoppelt, das ist eine Tautologie, die vielleicht in einem literarischen Text als Stilmittel verwendet werden kann, aber in einem Fachtext absolut nichts zu suchen hat, weil dies nur zu Verwirrung führt.
Ich nerve meine Nachbarn ja auch nicht mit Geschwätz von meinem "vierrädrigen" Porsche, sonst kommt womöglich noch einer – und zwar einer, der noch keine Ahnung von Autos hat, ein "Neuling" - auf die Idee sich beim Händler nach einem "fünfrädrigen" Porsche zu erkundigen. Der andere Nachbar, der, der sich mit Autos auskennt, der Profi, der würde sich nach einem Maserati erkundigen.
ja, wobei anchors auch bloss lookarounds sind. "^ looks behind", "$ looks ahead", "\b looks around".
^ ist sowas wie (?<!.)
Ja, ich weiß, habe aber diese Sichtweise bisher vernachlässigt. Die Frage ist jetzt, wenn du von einer "zero-width look behind assertion" sprichst, meinst du dann dieses »^« oder jenes Sprachelement »(?<! ... )«?
ach soo. meinst du sowas wie /ab/, wobei 'b' eine "one-width positiv look-ahead assertion" ist? *nase_ruempf*
Ja, wobei es aber nicht reicht, das einfach irgendjemand das behauptet, sondern es muss logisch nachvollziebar begründet sein. Und ich glaube ich kann das jetzt, du hast mir mit deinem Beispiel »^« = »(?<!.)« den entscheidenden Schlag auf den Hinterkopf verpasst. Ich muss das nochmal kurz durchdenken.
Gruß Uwe
gudn tach!
in »perldoc perlre«:
»We can deal with this by using both an assertion and a negation.«
Wobei hier in »(\D*)(?=\d)« das Element »\D*« als "assertion" bezeichnet wird.
nee, nee.
es faengt ja an mit "When using look-ahead assertions and negations [...] /^\D*(?!123)/".
(?!123) ist die "look-ahead assertion".
Ich übersetze "assertion" mit "Aussage". Ob man den Begriff mit "Aussage" oder "Behauptung" oder sonstwie übersetzt ist irrelevant, ich nehme "Aussage". [...]
keine einwaende.
Probleme entstehen nun, wenn man einem trivialen Begriff wie "Aussage" eine konkrete Bedeutung zudefiniert.
ja, solche probleme koennen entstehen, muessen aber nicht.
Ich kann ja auch hingehen und festlegen, bei mir heißen "zero-width"-Sprachelemente hinfort "Ützelprützel". Man kann mir dann vorwerfen der Name sei Schwachsinn, aber man kann mir nicht vorwerfen, es sei falsch,
er wuerde sogar dem problem der mehrdeutigkeit aus dem weg gehen; und lustig waere er obendrein.
es waere mal ein anderes regexp-buch, wenn du eine neue terminologie einfuehren wuerdest und nur noch von uetzelpruetzeln, grimsegorfs, himpeldimpeln und aehnlichem regen wuerdest. es koennte mit ein bissl glueck kult-status erlangen.
ja, wobei anchors auch bloss lookarounds sind. "^ looks behind", "$ looks ahead", "\b looks around".
^ ist sowas wie (?<!.)
Ja, ich weiß, habe aber diese Sichtweise bisher vernachlässigt. Die Frage ist jetzt, wenn du von einer "zero-width look behind assertion" sprichst, meinst du dann dieses »^« oder jenes Sprachelement »(?<! ... )«?
ja.
prost
seth
Hallo seth,
ich habe jetzt mal auf die Schnelle versucht den Begriff "assertion" grob zu definieren.
Der Begriff "assertion" (Aussage) steht nicht für eine konkrete Definition, wie, salopp gesagt, ein Rechteck ist eine geometrische Figur mit vier rechtwinkeligen Seiten. Ich könnte natürlich auch definieren, ein "Ützelprützel" ist eine geometrische Figur mit vier rechtwinkeligen Seiten. Nur gäbe es dann gewisse Kommunikationsschwierigkeiten, wenn ich dir erzählen würde ein Quadrat ist ein "Ützelprützel" ;-)
Er ist also zunächst undefiniert und steht nur für sich selbst, für seine eigene trivale Bedeutung, eine Aussage ist eine Aussage. Das heißt aber nicht, das solch ein trivialer Begriff inhaltslos ist, sondern er bezieht seine Bedeutung aus dem Kontext in dem er verwendet wird. Der Begriff Aussage hat im Kontext eines Polizeiverhörs (Ich mache eine Aussage) eine ganz andere Bedeutung als in einem mathematischen Kontext (die Aussage a=b mit a=1 und b=2 ist falsch).
Die Frage ist also, welche Bedeutung der Begriff Aussage (assertion) im Kontext einer Regulären Sprache besitzt.
Aussage steht nicht für einen definierten Begriff (um das nochmal zu wiederholen), sondern für eine Sichtweise auf ein Muster.
Ein Muster ist eine Aneinanderreihung von Aussagen in Form der Sprachelemente.
Eine Aussage ist dabei durch drei Merkmale gekennzeichnet:
1. wahr oder falsch
2. Eine Richtung in die geprüft wird (look ahead, look behind oder look around)
3. Die Anzahl der Zeichen, die gefressen werden (zero-width, one-width, multiple-width)
Das Syntaxelement »\d« ist eine »one-width look ahead assertion«
Das Syntaxelement »a« (das literale Zeichen*) ist eine »one-width look ahead assertion«
Das Syntaxelement »(?=a)« ist eine »zero-width look ahead assertion«
Und um es etwas aufzupeppen:
Das Muster »(?=(a{2}))\1« ist eine »zero-width look ahead assertion«, gefolgt von einer »two-width look ahead assertion«, zusammen gesehen, handelt es sich um eine »two-width look ahead assertion«
* nicht das konkrete literale Zeichen »a« ist ein Syntaxelement, sondern ein literales Zeichen als solches
Gruß Uwe
gudn tach!
ich habe jetzt mal auf die Schnelle versucht den Begriff "assertion" grob zu definieren. [...]
aeh, wirst du das in etwa so auch in deinem buch machen wollen? das wuerde afais jeden neuling komplett verwirren oder auf den falschen weg bringen, weil es die sache imho unnoetig verkompliziert.
Das Syntaxelement »\d« ist eine »one-width look ahead assertion«
aber warum willst du ueberhaupt "one-width look ahead assertions" einfuehren? deine vorgehensweise ist zwar konsistent, aber mir scheint der begriff ueberfluessig zu sein.
klar, man kann sagen, dass in
/uetzelpruetzel/
"etzelpruetzel" eine multiple-width look ahead assertion von "u" ist, dass "elpru" eine multiple-width look behind assertion von dem letzten "etzel" ist. aber das braucht man doch nicht. in der praxis wuerde man solche begriffe schlichtweg nicht benoetigen, geschweige denn benutzen.
es ist ja klar, dass bei /uetzelpruetzel/ eine zeichfolge gematcht werden soll, die ein "u" enthaelt, auf das ein "e" folgt, auf das ein "t" folgt etc.
Das Muster »(?=(a{2}))\1« ist eine »zero-width look ahead assertion«, gefolgt von einer »two-width look ahead assertion«, zusammen gesehen, handelt es sich um eine »two-width look ahead assertion«
das wuerde mich als neuling endgueltig verwirren. es erweckt dann zudem den eindruck, dass es dasselbe waere wie "(a{2})". ist es aber nicht, es ist "(?>(a{2}))".
ich haette es so formuliert:
(?=(a{2}))\1 ist hinterhaeltiges pattern. zunaechst taeuscht es durch eine <b>zero-width</b> look-ahead assertion an, ein subpattern - hier (a{2}) - gar nicht in $& aufzunehmen. direkt nach dieser assertion wird jedoch erzwungen, dass das subpattern doch noch in $& reingestopft wird, und zwar durch die backreference \1.
zusammengenommen hat dies denselben effekt, wie er beim atomic grouping auftritt, da sich das subpattern innerhalb der look-ahead assertion nicht darum kuemmert, was danach im restlichen pattern noch so alles verlangt wird, d.h. es wird unabhaengig vom restlichen pattern fleissig alles gefressen, was nicht bei drei auf den baeumen ist, naja ok, in diesem fall sind es nur zwei "a".
somit ist (?=(a{2}))\1 aequivalent zu dem independant pattern (?>(a{2})).
prost
seth
Hallo seth,
ich habe jetzt mal auf die Schnelle versucht den Begriff "assertion" grob zu definieren. [...]
aeh, wirst du das in etwa so auch in deinem buch machen wollen? das wuerde afais jeden neuling komplett verwirren oder auf den falschen weg bringen, weil es die sache imho unnoetig verkompliziert.
Ich weiß noch nicht wie ich mit dem Begriff "assertion" umgehen werde, ich muss das erst einmal sacken lassen. Aber du hast vollkommen recht, diese sehr theoretische, sehr abstrakte Beschreibung wäre kontraproduktiv und ist in dieser Form nicht für den Leser gedacht und nicht geeignet.
Ich kann vermutlich durchaus auf den Begriff "assertion" verzichten und eben nur erwähnen und kurz erklären wie er üblicherweise verwendet wird.
Für einen Teil, also einen Bestandteil, eines Muster verwende ich den Begriff Musterelement (du erinnerst dich, vorher der Begriff Teilmuster, den ich auf deinen Rat hin hab fallen lassen). Auf "Musterelement" kann ich diese "assertion"-Sichtweise auch anwenden, was ich im Prinzip auch bisher schon getan habe.
1. wahr oder falsch
2. Richtung
3. Anzahl, der zu fressenden Zeichen
Diese Sichtweise als solche scheint mir für das Verständnis, wie ein Muster dann tatsächlich abgearbeitet wird, sehr hilfreich. Oder spricht da etwas dagegen?
Das Syntaxelement »\d« ist eine »one-width look ahead assertion«
aber warum willst du ueberhaupt "one-width look ahead assertions" einfuehren?
Ich bin da nicht fixiert drauf, zumal ich keine Texte kenne, die diesen Begriff explizit und begründend unterstützen, er ist vermutlich wirklich einfach überflüssig. Ich könnte also hingehen und unter dem Begriff "assertion", wie es ja nun einmal verbreitet ist, "zero-width"-Syntaxelemente subsumieren. Das einzige was mich daran stört, und sogar richtig nervt, ist dann diese Tautologie bei Wendungen wie "zero-width ... assertion".
Das Muster »(?=(a{2}))\1« ist eine »zero-width look ahead assertion«, gefolgt von einer »two-width look ahead assertion«, zusammen gesehen, handelt es sich um eine »two-width look ahead assertion«
das wuerde mich als neuling endgueltig verwirren.
Das war eine, ein wenig scherzhafte, Zuspitzung :-)
es erweckt dann zudem den eindruck, dass es dasselbe waere wie "(a{2})". ist es aber nicht, es ist "(?>(a{2}))".
Moment, stehe ich jetzt auf dem Schlauch, es ist doch dasselbe wie »(a{2})«?
Gilt nicht? »(?=(a{2}))\1« = »(?>(a{2}))« = »(a{2})«
Wobei die "atomic group" hier "inhaltlich" eigentlich nicht angebracht ist. Das Wesen einer "atomic group" kommt ja nur zum Ausdruck, wenn der Quantifier variabel ist.
ich haette es so formuliert:
(?=(a{2}))\1 ist hinterhaeltiges pattern.
Genau- das trifft es :-)
Gruß Uwe
gudn tach Uwe!
Auf "Musterelement" kann ich diese "assertion"-Sichtweise auch anwenden, was ich im Prinzip auch bisher schon getan habe.
- wahr oder falsch
- Richtung
- Anzahl, der zu fressenden Zeichen
Diese Sichtweise als solche scheint mir für das Verständnis, wie ein Muster dann tatsächlich abgearbeitet wird, sehr hilfreich. Oder spricht da etwas dagegen?
hmm, mag sein. aber um das beurteilen zu koennen, muesste ich, glaube ich, was handfestes haben. "richtung" bei musterelementen ist mir nicht ganz klar.
Das einzige was mich daran stört, und sogar richtig nervt, ist dann diese Tautologie bei Wendungen wie "zero-width ... assertion".
und wenn du's einfach als abkuerzung (aehnlich wie bei lookbehind) siehst?
es erweckt dann zudem den eindruck, dass es dasselbe waere wie "(a{2})". ist es aber nicht, es ist "(?>(a{2}))".
Moment, stehe ich jetzt auf dem Schlauch, es ist doch dasselbe wie »(a{2})«?
Gilt nicht? »(?=(a{2}))\1« = »(?>(a{2}))« = »(a{2})«
Wobei die "atomic group" hier "inhaltlich" eigentlich nicht angebracht ist. Das Wesen einer "atomic group" kommt ja nur zum Ausdruck, wenn der Quantifier variabel ist.
oops, sorry, hast natuerlich vollkommen recht.
prost
seth
Hallo seth,
We can deal with this by using both an assertion and a negation.«
Wobei hier in »(\D*)(?=\d)« das Element »\D*« als "assertion" bezeichnet wird.
nee, nee.
Hast vollkommen recht, ich seh vor lauter "assertions" den Wald nicht mehr :-)
"richtung" bei musterelementen ist mir nicht ganz klar.
Die Richtung, in der geprüft wird: to look ahead, to look behind oder to look around
Das einzige was mich daran stört, und sogar richtig nervt, ist dann diese Tautologie bei Wendungen wie "zero-width ... assertion".
und wenn du's einfach als abkuerzung (aehnlich wie bei lookbehind) siehst?
Nein ,kann ich nicht, das geht mir gegen den Strich. Ich bin von Anfang an mit "assertion", in der Form wie es verwendet wird, nicht zurecht gekommen. Leider habe ich, weil ich mit Perl nichts am Hut habe, »perldoc perlre« zu spät zur Kenntnis genommen. Denn es gibt dort eben zwei Sätze an denen kann und will ich nicht vorbei, die stützen meine Sicht der Dinge.
»It's important to realize that a regular expression is merely a set of assertions that gives a definition of success.«
»/ab/ means match "a" AND (then) match "b", although the attempted matches are made at different positions because "a" is not a zero-width assertion, but a one-width assertion.«
Beachte "... is merely ...", denn die Sache als solche ist banal, man nimmt diese Sichtweise, ohne dass man es explizit ausspricht, sowieso ein.
Aber der einzige der hier ein "Machtwort" sprechen könnte wäre "Friedl", ich habe aber nur den alten von 2002, wo nichts über "assertions" drin steht.
Gruß Uwe
gudn tach!
"richtung" bei musterelementen ist mir nicht ganz klar.
Die Richtung, in der geprüft wird: to look ahead, to look behind oder to look around
"around" ist keine richtung (es sind (hier im 1d) zwei). ;-p
Das einzige was mich daran stört, und sogar richtig nervt, ist dann diese Tautologie bei Wendungen wie "zero-width ... assertion".
und wenn du's einfach als abkuerzung (aehnlich wie bei lookbehind) siehst?Nein ,kann ich nicht, das geht mir gegen den Strich. [...]
»/ab/ means match "a" AND (then) match "b", although the attempted matches are made at different positions because "a" is not a zero-width assertion, but a one-width assertion.«
ok, ok. "assertion" wird also sogar von einem der goetter (perldoc) als ein umfassenderer ueberbegriff verwendet, als ich es dachte.
allerdings ist es dann afais immer noch nicht einfach ein synonym zu "subexpression", "subpattern" oder so, sondern eher sowas wie das kontextuelle subpattern eines kontextsensitiven patterns, oder?
in /abc/ ist also u.a.
b eine one-width positive look-ahead assertion von a,
b eine one-width positive look-behind assertion von c,
c und a jeweils eine one-width positive look-ahead bzw. look-behind assertion von b.
Beachte "... is merely ...", denn die Sache als solche ist banal, man nimmt diese Sichtweise, ohne dass man es explizit ausspricht, sowieso ein.
ja. und deshalb wird es auch erst sehr spaet in "perlre" erwaehnt und nicht gleich zu beginn oder gar in "perlrequick". einen neuling koennte diese sichtweise, wenn sie zu beginn explizit ausgesprochen wird, bloss verwirren. implizit versteht er es aber.
vielleicht vergleichbar mit jemandem, der einfach so laufen lernt, aber stolpert, sobald er sich gedanken darueber macht, ein bein vor das andere zu setzen, und auch schwierigkeiten beim laufen-lernen gehabt haette, wenn ihm jemand die details der muskelbewegungen erklaert haette.
wenn du - wieder bezogen auf dein buch - den begriff "assertion" erst sehr spaet, wenn der leser schon vieles gelernt hat, auseinandernimmst und detailliert beleuchtest, dann waer' das ok. aber gleich zu beginn mit sowas zu kommen, koennte imho mehr verwirren als helfen.
wie wirst du vorgehen?
prost
seth
Hallo seth,
"around" ist keine richtung (es sind (hier im 1d) zwei). ;-p
Ja :-) Jetzt bist du aber haarspalterischer als ich ;-)
in /abc/ ist also u.a.
b eine one-width positive look-ahead assertion von a,
Nein, bei den drei Punkten, die ich genannt habe, fehlen noch zwei, die ich nicht explizit genannt habe. Ich möchte das aber an anderer Stelle, in einem Gesamtzusammenhang, erklären.
schwierigkeiten beim laufen-lernen gehabt haette, wenn ihm jemand die details der muskelbewegungen erklaert haette.
Gebe ich dir absolut recht. Aber, aber, aber, es geht ja gerade nicht um Details, sondern um eine Abstraktion. Es geht um einen grundsätzlichen Mechanismus. Ich will, in Anlehnung an dein Laufen-lernen-Bild, das Fahrrad-fahren-lernen-Bild nehmen.
Man kann dem Kind tausend Dinge erklären, was es tun soll worauf es achten soll, wie dies und jenes funktioniert. Es passiert, was du sagst, es ist verwirrt, es ist überfordert, es wird auf die Nase fallen.
Man kann ihm aber auch nur einen wesentlichen, grundlegenden Mechanismus erklären. Das Fahrrad muss eine bestimmte Mindestgeschwindigkeit haben, damit man nicht umfällt. Allerdings sollte man einen weiteren grundlegenden Mechanismus nicht vergessen, den des Bremsens ;-)
wie wirst du vorgehen?
Darüber denke ich gerade nach.
Ich glaube ich bin jetzt soweit, dass ich ein abstraktes, geschlossenes und konsistentes Funktionsmodell entwerfen kann. Ob mir das tatsächlich gelingt, weiß ich jetzt aber noch nicht, vielleicht führt das auch in eine Sackgasse. Außerdem besteht natürlich die Gefahr, dass ich mich verrannt habe und beispielsweise falsche Prämissen zugrunde lege.
Dieses "Gedankenkonstrukt" muss daher objektiv (außerhalb von mir) auf Realitätstauglichkeit geprüft werden. Das werde ich allerdings nicht in einem öffentlichen Rahmen tun. Ich würde deswegen gerne – zu gegebener Zeit – auf dich zukommen. Sag mir Bescheid, ob das für dich in Ordnung wäre.
Gruß Uwe
gudn tach!
"around" ist keine richtung (es sind (hier im 1d) zwei). ;-p
Ja :-) Jetzt bist du aber haarspalterischer als ich ;-)
(grinsend-zaehezeigender-sonnenbrillen-smilie)
Dieses "Gedankenkonstrukt" muss daher objektiv (außerhalb von mir) auf Realitätstauglichkeit geprüft werden. Das werde ich allerdings nicht in einem öffentlichen Rahmen tun. Ich würde deswegen gerne – zu gegebener Zeit – auf dich zukommen. Sag mir Bescheid, ob das für dich in Ordnung wäre.
schreiben kannst du mir immer. allerdings kann es auch passieren, dass ich dann gerade keine zeit habe, d.h. dass meine antwort etwas auf sich warten laesst. bzgl. des testens deiner didaktik wuerden sich allerdings auch vor allem blutige regexp-anfaenger anbieten, oder?
prost
seth
Hallo seth,
d.h. dass meine antwort etwas auf sich warten laesst.
Das ist kein Problem.
bzgl. des testens deiner didaktik wuerden sich allerdings auch vor allem blutige regexp-anfaenger anbieten, oder?
Ja, aber hier geht es mir ausschließlich um das Funktionsmodell, was ja nichts anderes ist als eine bestimmte Sichtweise.
Zwei Dinge sind da zu beurteilen.
1. Beschreibt das Modell die Realität, d. h. taugt es etwas.
2. Bringt es Vorteile gegenüber den "herkömmlichen Sichtweisen".
Das kann nur jemand beurteilen, der sich in der Materie auskennt, deswegen dachte ich da an dich. Aber es wird so oder so etwas dauern.
Lieber seth, ich danke dir für die Diskussion, sie hat mir, wie schon unsere vorherige, ein umfassenderes und tieferes Verständnis der Thematik ermöglicht.
Gruß Uwe
Hallo seth,
und nur noch von uetzelpruetzeln, grimsegorfs, himpeldimpeln und aehnlichem regen wuerdest
Du wirst lachen, Begriffe zu verfremden ist ein didaktisches Mittel, das ich im mündlichen Unterricht häufig einsetze. Ich mache das mit großem Vergnügen, weil das in der Regel zunächst zu Entrüstung führt ("was für ein Schwachsinn"), aber dann genau das passiert, was ich erreichen will, der anscheinend gottgegebene Begriff wird plötzlich hinterfragt.
nee, nee.
es faengt ja an mit "When using look-ahead assertions and negations [...] /^\D*(?!123)/".
(?!123) ist die "look-ahead assertion".
Schaue ich mir gleich nochmal in aller Ruhe an, nicht dass ich da doch etwas missverstanden habe.
Gruß Uwe