Gibt es eine Möglichkeit, bei einem regulären Ausdruck die Gesamtlänge noch mit zu überprüfen?
Beispiel:
Regulärer Ausdruck: [color=green](ab*c)+[/color]
Und es sollen maximal 100 Zeichen sein.
Da der Inhalt der Klammer beliebig lang sein kann, kann man das + am Ende nicht einfach durch eine Mengenangabe ersetzen.
Und da die Gesamtmenge beliebig ist kann man das * in der Klammer auch nicht durch eine Mengenangabe ersetzen...
Irgendwelche Ideen?
Regulärer Ausdruck - Gesamtlänge mit überprüfen?
gepostet vor 19 Jahre, 3 Monate von BLUESCREEN
gepostet vor 19 Jahre, 3 Monate von _Jan_
Ich weiss nich ob ichs richtig verstanden hab, aber die länge der zeichenketten kann man mit strlen nachprüfen (das meintest du aber nich, oder? )
gepostet vor 19 Jahre, 3 Monate von BLUESCREEN
Original von _Jan_
Ich weiss nich ob ichs richtig verstanden hab, aber die länge der zeichenketten kann man mit strlen nachprüfen
Ne, kann man eben nicht, weil der reguläre Ausdruck ja nur auf einen Teil des Strings passen muss...
Beispiel:
ddddabbbbcacdd
Da wäre die Länge des regulären Ausrucks dann 8 Zeichen, aber der gesamte String ist 14 Zeichen lang.
Die einzige Möglichkeit, die ich sehe, ist, neben preg_match nochmal preg_replace anzuwenden, um damit den passenden Bereich aus dem String zu entfernen und anschließend die Länge mit dem Ursprünglichen String zu vergleichen. So kann man dann berechnen, wie lang der passende String war.
gepostet vor 19 Jahre, 3 Monate von Kampfhoernchen
gepostet vor 19 Jahre, 3 Monate von HSINC
(ab(*){0,100}c)+ ??
die problemstellung ist ein wenig ungenau
die problemstellung ist ein wenig ungenau
gepostet vor 19 Jahre, 3 Monate von BLUESCREEN
Original von Kampfhoernchen
Hier solltest du was finden:
http://www.regenechsen.de/index.php
Links zu irgendwelchen Seiten zu posten, ohne zu wissen, ob diese das Problem wirklich lösen, ist immer toll... :roll:
Original von HSINC
(ab(*){0,100}c)+ ??
die problemstellung ist ein wenig ungenau
Das Sternchen und die runden Klammern machen da irgendwie keinen Sinn.
Und wenn man das weglässt, dann hätte ich bis zu 100 "b".
Gewollt sind aber bis zu 100 Zeichen bestehend aus beliebig vielen Zeichenketten vom Typ "a, beliebig viele b, c".
Das Beispiel in meinem zweiten Post sollte das doch ziemlich genau erklären.
gepostet vor 19 Jahre, 3 Monate von HSINC
stimmt *g*
edit : oki nun weiss ich was du willst
edit2: das ist nicht trivial *g*
edit : oki nun weiss ich was du willst
edit2: das ist nicht trivial *g*
gepostet vor 19 Jahre, 3 Monate von Kallisti
Regulaeren Ausdruck anwenden und das Resultat dann mit Programmiersprachen Bordmitteln kappen?
In Perl greift man auf die eingeklammerten Elemente der regexps mit $1 $2 etc. zu...
Keine Ahnung wie das in PHP ist..
In Perl greift man auf die eingeklammerten Elemente der regexps mit $1 $2 etc. zu...
Keine Ahnung wie das in PHP ist..
gepostet vor 19 Jahre, 3 Monate von BLUESCREEN
Original von Kallisti
Regulaeren Ausdruck anwenden und das Resultat dann mit Programmiersprachen Bordmitteln kappen?
In Perl greift man auf die eingeklammerten Elemente der regexps mit $1 $2 etc. zu...
Keine Ahnung wie das in PHP ist..
Da kann man nur innerhalb des Funktionsaufrufs auf diese Werte zugreifen - z.B. mit preg_replace...
Jedenfalls scheint es nicht möglich zu sein, nur mit preg_match das zu erreichen, was oben beschrieben ist.
gepostet vor 19 Jahre, 3 Monate von HSINC
jo bin geneigt dir zuzustimmen
wenn dann wohl zweistufig, erst preg_match_all mit =ab*c= und dann auf das array was entsteht jeweils nen preg_match mit der längenprüfung
wenn dann wohl zweistufig, erst preg_match_all mit =ab*c= und dann auf das array was entsteht jeweils nen preg_match mit der längenprüfung
gepostet vor 19 Jahre, 2 Monate von McSodburner
Also wenn ich das richtig verstanden habe, gehts doch so:
(a|b|c){0,100}
Oder habs ich jetzt doch falsch verstanden?
(a|b|c){0,100}
Oder habs ich jetzt doch falsch verstanden?
gepostet vor 19 Jahre, 2 Monate von Grelor Blood
Mit der Hilfe von "Lookbehind Assertions" sollte sich sowas regeln lassen...
a(a(?<=a|c)|b(?<=a|b)|c){0,98}c
D.h. der Ausdruck beginnt einmal mit a und hört mit c auf, der Rest kann also max. 98 Zeichen lang sein. Ein a kann nur dann kommen, wenn vorher ein a oder ein c gewesen ist (also nach keinem b). Für ein b muss vorher ein a oder ein b gekommen sein, beim c kommen a, b und c als Vorgänger in Frage, deshalb wird hier nicht auf den Vorgänger überprüft.
a(a(?<=a|c)|b(?<=a|b)|c){0,98}c
D.h. der Ausdruck beginnt einmal mit a und hört mit c auf, der Rest kann also max. 98 Zeichen lang sein. Ein a kann nur dann kommen, wenn vorher ein a oder ein c gewesen ist (also nach keinem b). Für ein b muss vorher ein a oder ein b gekommen sein, beim c kommen a, b und c als Vorgänger in Frage, deshalb wird hier nicht auf den Vorgänger überprüft.
gepostet vor 19 Jahre, 2 Monate von Chojin
Wir könnten mal die wichtigsten Regex in die Snippets Datenbank eintragen.
-> Username überprüfen
-> Email überprüfen
-> md5 überprüfen
(ich blick das wiki aber nicht und will nix put machen)
reg4rds
chojin
-> Username überprüfen
-> Email überprüfen
-> md5 überprüfen
(ich blick das wiki aber nicht und will nix put machen)
reg4rds
chojin
gepostet vor 19 Jahre, 2 Monate von BLUESCREEN
Original von McSodburner
Also wenn ich das richtig verstanden habe, gehts doch so:
(a|b|c){0,100}
Oder habs ich jetzt doch falsch verstanden?
Ja, hast du falsch verstanden
Bei deinem Ausdruck wäre auch "bbb" möglich, was aber nicht so sein sollte...
Original von Chojin
Wir könnten mal die wichtigsten Regex in die Snippets Datenbank eintragen.
-> Username überprüfen
-> Email überprüfen
-> md5 überprüfen
Das halte ich eher für sinnlos, da bei den Usernames jedes BG seine eigenen Konventionen hat und MD5 sehr einfach ist: ^[[digit:]]{32}$
Zu den E-Mail-Adressen sag ich erstmal nichts - damit schlage ich mich schon seit längerem rum und das ist komplexer als man denkt...
Original von Grelor Blood
Mit der Hilfe von "Lookbehind Assertions" sollte sich sowas regeln lassen...
(...)
D.h. der Ausdruck beginnt einmal mit a und hört mit c auf, der Rest kann also max. 98 Zeichen lang sein.
Soweit richtig...
Original von Grelor Blood
Ein a kann nur dann kommen, wenn vorher ein a oder ein c gewesen ist (also nach keinem b).
...falsch, denn ein a kann nur hinter einem c stehen (mal abgesehen von dem a am Anfang)...
Original von Grelor Blood
Für ein b muss vorher ein a oder ein b gekommen sein
....stimmt...
Original von Grelor Blood
beim c kommen a, b und c als Vorgänger in Frage
...wieder falsch, denn ein c kann nur nach einem a oder einem b stehen.
Abgesehen davon hast du die Assertions falsch herum angewendet:
Original von Grelor Blood
a(a(?<=a|c)|b(?<=a|b)|c){0,98}c
Beispielsweise wäre a(?<=a|c) so richtig gewesen: (?<=a|c)a
Trotz allem danke für den Post, denn obwohl ich mit den Assertions zuerst keine Lösung gefunden habe, hat mich dein Ansatz jetzt doch zu einem funktionierenden Ausdruck gebracht
[color=green][size=12]a(((?<=c)a)|((?<=[ab])[bc])){0,98}(?<=[ab])c[/size][/color]
gepostet vor 19 Jahre, 2 Monate von TheUndeadable
Ich frage mich nur, ob dein Regex schneller ist oder eine händische Überprüfung der Zeichen. Dieses Regex erscheint mir doch als recht langsam. Kann aber auch nur eine Erscheinung sein