Regulärer Ausdruck
bubble
- php
Hi,
ich verzweifle grade an einem reglären Ausdruck.
Stark vereinfacht sieht der reguläre Ausdruck so aus:
/([\w\d]){3,5}aaa([\w\d]){3,5}/i
Das würde allerdings zB. bei abc12aaaefg "matchen", ich möchte aber, das er nur dann was findet wenn der erste Musterteil und der zweite gleich sind.
ab123aaaab123 soll matchen, ab123aaaxyz123 nicht.
Irgendwie komme ich auch nicht auf Stichworte die mir dabei weiterhelfen, damit ich google befragen kann.
Ich brauch das ganze für preg_match
MfG
bubble
Tach!
[...] ich möchte aber, das er nur dann was findet wenn der erste Musterteil und der zweite gleich sind.
ab123aaaab123 soll matchen, ab123aaaxyz123 nicht.
Irgendwie komme ich auch nicht auf Stichworte die mir dabei weiterhelfen, damit ich google befragen kann.
Ich würde dazu nicht Google sondern das PHP-Handbuch zur Pattern Syntax bemühen. Wenn es etwas gibt, dann steht der Lösungsweg dort aufgeführt.
Die ersten Anbschnitte bis Alternation dürftest du schon kennen. Internal Option Settings wirds wohl nicht sein. Subpatterns wirst du brauchen, kennst du aber schon. Repetition hast du auch in diesem Fall schon angewendet. Dann kommen Back References - vielleicht sind die ja was.
dedlfix.
@@dedlfix:
nuqneH
Dann kommen Back References - vielleicht sind die ja was.
Aber bitte das Suchmuster dann nicht mehr „regulären Ausdruck“ nennen.
Qapla'
gudn tach!
Dann kommen Back References - vielleicht sind die ja was.
Aber bitte das Suchmuster dann nicht mehr „regulären Ausdruck“ nennen.
doch. :-)
dass in der programmierwelt regulaere ausdruecke nicht dasselbe sind wie in der theoretischen informatik, heisst nicht, dass nur die eine fraktion global recht (und die anderen unrecht) hat. wenn du solche pattern anders nennen willst, darfst du das gerne tun. aber spreche denjenigen, die nicht dein sprachempfinden teilen, die sich aber dennoch nach einer gaengigen sprachkonvention artikulieren, nicht deren (sprachliche) kompetenz ab, was du mit dieser bitte naemlich indirekt tust.
iow: es ist nicht falsch, backreferences als teil regulaerer ausdruecke zu bezeichnen, wenn man sich im kontext der (praktischen) programmierung bewegt. im kontext der TI dagegen waere es zweifelsohne tatsaechlich falsch, aber in jenem kontext bewegen wir uns hier im forum aeusserst selten.
prost
seth
@@seth:
nuqneH
dass in der programmierwelt regulaere ausdruecke nicht dasselbe sind wie in der theoretischen informatik, heisst nicht, dass […]
Es heißt, dass die Programmierer (Handwerker) einen Begriff aus der Informatik (Wissenschaft und Kunst) übernommen haben, ohne gänzlich zu verstehen, was er bedeutet.
Wie wenig Veständnis Programmierer mitunter von Informatik haben, zeigt sich bei manchem Pfusch am Bau.
Qapla'
gudn tach!
dass in der programmierwelt regulaere ausdruecke nicht dasselbe sind wie in der theoretischen informatik, heisst nicht, dass […]
Es heißt, dass die Programmierer (Handwerker) einen Begriff aus der Informatik (Wissenschaft und Kunst) übernommen haben, ohne gänzlich zu verstehen, was er bedeutet.
nein.
der begriff der regulaeren ausdruecke ist seit >40 jahren in der programmierung vorhanden. da ist ein begriffswandel bzw. eine semantische emanzipation nichts ungewoehnliches.
in natuerlichen sprachen sind ambiguitaeten nichts seltenes und auch nichts verwerfliches.
prost
seth
@@seth:
nuqneH
der begriff der regulaeren ausdruecke ist seit >40 jahren in der programmierung vorhanden.
Ja, und? Ein Großteil dieser Zeit waren Suchmuster tatsächlich nur reguläre Ausdrücke.
Seit wievielen Jahren gibt es denn Suchmuster mit Backreferences in der Programmierung?
da ist ein begriffswandel bzw. eine semantische emanzipation nichts ungewoehnliches.
Hm, Oxidationsreaktionen, an denen gar kein Suerstoff beteiligt ist?
Qapla'
Lieber Gunnar Bittersmann,
jetzt will ich Deine Korinthen mal mit ein paar von meinen Verunreinigen:
Hm, Oxidationsreaktionen, an denen gar kein Suerstoff beteiligt ist?
Was genau in der Diskussion vergleichst Du mit Suerstoff[sic!] in Bezug auf Oxidationsreaktionen? Etwa "Reguläre Ausdrücke"? Du selbst definierst diese durch Deinen Sprachgebrauch ja als Untermenge von (PCRE-artigen) Suchmustern! Insofern passt Dein Einwand nicht.
Ätsch. (Klugscheißen macht mir besonders Spaß, wenn es keinen tieferen Sinn hat, daher hier mein Einwand. ^^)
Liebe Grüße,
Felix Riesterer.
gudn tach!
der begriff der regulaeren ausdruecke ist seit >40 jahren in der programmierung vorhanden.
Ja, und? Ein Großteil dieser Zeit waren Suchmuster tatsächlich nur reguläre Ausdrücke.
das muss aber ein sehr kleiner grossteil gewesen sein, s.u.
Seit wievielen Jahren gibt es denn Suchmuster mit Backreferences in der Programmierung?
gute frage.
regexps gibt's wohl so ungefaehr seit den 60ern in der programmierung, aber genaue werte kenne ich da nicht.
die relevanteren, bekannteren tools wie ed, grep, sed, awk und vim gibt's erst seit den 70ern. was die so konnten, weiss ich nicht. jedenfalls haben die unter regexp nicht alle das gleiche verstanden. versuche zur vereinheitlichung kamen erst sehr viel spaeter, BRE/ERE bei POSIX z.b. 1986 oder 1987.
wann diese alten tools (ed, sed, ...) angefangen haben, backreferences und aehnliches zu supporten, weiss ich nicht. aber ich weiss, dass sich Larry Wall bei perl an diesen tools orientiert hat. und in perl gibt's backreferences schon seit version 1.0, also 1987.[1] somit gibt's die schon seit 25 jahren (belegt), vermutlich aber schon viel laenger.
da ist ein begriffswandel bzw. eine semantische emanzipation nichts ungewoehnliches.
Hm, Oxidationsreaktionen, an denen gar kein Suerstoff beteiligt ist?
ja z.b., oder auch die "anorganische" chemie.
prost
seth
Liebe(r) bubble,
zusätzlich zu Dedlfix' Antwort möchte ich Dir noch eine Überlegung von mir mitgeben:
/([\w\d]){3,5}aaa([\w\d]){3,5}/i
In JavaScript muss ich als Delimiter den Slash verwenden, in PHP nicht. Daher benutze ich ein Zeichen, das in meinen Patterns am seltensten vorkommt: Die Tile (~). Vergleiche:
~([\w\d]){3,5}aaa([\w\d]){3,5}~i
Liebe Grüße,
Felix Riesterer.
gudn tach!
ich verzweifle grade an einem reglären Ausdruck.
Stark vereinfacht sieht der reguläre Ausdruck so aus:
/([\w\d]){3,5}aaa([\w\d]){3,5}/i
den kann man noch vereinfachen, denn die zeichenklasse \w umfasst bereits die zeichenklasse \d.
/\w{3,5}aaa\w{3,5}/i
beachte aber, dass \w locale-abhaengig ist, siehe php-manual, also nicht notwendig immer dasselbe bedeutet. wenn du nicht sicher sein kannst, ob die 'locale' einstellungen passen und ob sie konstant bleiben, dann gibt die elemente der zeichenklassen besser explizit an, z.b. statt \w z.b. [a-zA-Z0-9_].
[...] ich möchte aber, das er nur dann was findet wenn der erste Musterteil und der zweite gleich sind.
ab123aaaab123 soll matchen, ab123aaaxyz123 nicht.
das zugehoerige stichwort ist, wie dedlfix bereits andeutete "back-reference" (weitere begriffe waeren "capture groups" oder "capture buffers"). dem php-manual fehlen imho ein paar uebersichtlich angeordnete hilfreiche beispiele, deswegen verweise ich mal zusaetzlich aufs selfhtml-wiki (dort insb. die tabelle), auch wenn sich jener artikel eigentlich auf perl bezieht (macht aber nix, php und perl verhalten sich hierbei hinreichend aehnlich).
prost
seth