regexp ^ Anfang, oder, Verneinung
frankx
- programmiertechnik
Hellihello
was ich irgendwie nicht hinbekomme ist:
Am Anfang darf nicht aaa oder bbb vorkommen.
Treffer wären alles außer
aaa......
bbb......
die Punkte jetzt als u.s.w. gemeint.
^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?
Dank und Gruß,
frankx
Hallo frankx,
^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?
Die Verneinung müsste noch in die Klammer also:
^(^aaa|^bbb)
Gruß,
Dodwin
Hellihello Dodwin,
^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?
Die Verneinung müsste noch in die Klammer also:
^(^aaa|^bbb)
mmh...;
<?php
$subject = "bbbaaabcdef";
$pattern = '/^(^aaa|^bbb).*/';
preg_match($pattern, $subject, $matches);
print_r($matches);
?>
bringt bei mir:
Array
(
[0] => bbbaaabcdef
[1] => bbb
)
Dank und Gruß,
frankx
gudn tach!
Die Verneinung müsste noch in die Klammer also:
^(^aaa|^bbb)
wie gesagt: kaese.
vorschlag:
$subject = "bbbaaabcdef";
$pattern = '/^(aaa|bbb)/';
if(preg_match($pattern, $subject)==0)
echo '$subject ist wie gewuenscht.';
ansonsten gibt's auch noch eine methode ueber zero-width negative look-ahead assertions:
der ausdruck waere dann:
/^(?!aaa|bbb)/
der macht das, was du urspruenglich wolltest.
prost
seth
Hellihello seth,
ansonsten gibt's auch noch eine methode ueber zero-width negative look-ahead assertions:
der ausdruck waere dann:
/^(?!aaa|bbb)/
der macht das, was du urspruenglich wolltest.
hört sich prima an (;-).
A zero-width negative look-ahead assertion. For example /foo(?!bar)/ matches any occurrence of "foo" that isn't followed by "bar". Note however that look-ahead and look-behind are NOT the same thing. You cannot use this for look-behind. http://perldoc.perl.org/perlre.html
Heißt also in dem Fall übersetzt: "Der Anfang direkt gefolgt von nicht aaa und auch nicht bbb (= nicht [aaa oder bbb])".
Dank und Gruß,
frankx
Hallo,
^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?
Die Verneinung müsste noch in die Klammer also:
^(^aaa|^bbb)
So geht das AFAIK nicht, weil das „^“ nur in eckigen Klammer als Verneinung gilt.
Der Regexp müsste wohl eher so aussehen:
/^([^a]{3}|[^b]{3})/
mfg. Daniel
gudn tach!
^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?
Die Verneinung müsste noch in die Klammer also:
^(^aaa|^bbb)So geht das AFAIK nicht, weil das „^“ nur in eckigen Klammer als Verneinung gilt.
genau.
/^(^aaa|^bbb)/
matcht alles, was mit ^aaa oder ^bbb beginnt. das wollte der OP aber nicht.
Der Regexp müsste wohl eher so aussehen:
/^([^a]{3}|[^b]{3})/
nein. bbb wird von [^a]{3}\ gematcht und aaa von [^b]{3}.
prost
seth
Hallo,
Der Regexp müsste wohl eher so aussehen:
/^([^a]{3}|[^b]{3})/
nein. bbb wird von [^a]{3}\ gematcht und aaa von [^b]{3}.
Stimmt, das wäre wohl immer true.
Das:
/^([^ab]{3})/
…wiederum matcht auch „bab“ oder „aab“ nicht. Bleibt also doch nur noch die anschließende Invertierung…
mfg. Daniel
Hellihello
…wiederum matcht auch „bab“ oder „aab“ nicht. Bleibt also doch nur noch die anschließende Invertierung…
will heißen, ich suche nach ^(aaa|bbb) und sage dann eben, "wenn nicht" mit der umgebenden Sytax. Beim RewriteRule wäre dass dann "!", wobei vermutlich die Frage ist, ob so eine quasi doppelte Verneinung semantisch sinnvoll wäre.
Dank und Gruß,
frankx
Hallo,
wobei vermutlich die Frage ist, ob so eine quasi doppelte Verneinung semantisch sinnvoll wäre.
Warum eigentlich doppelte Verneinung? Zuerst sucht man die entspr. Zeichen und dann verneint man sie. Ist für mich ein ja-nein.
Trotzdem Schade, dass es keine &-Verknüpfungen in Regexp gibt…
mfg. Daniel
Hellihello Daniel,
wobei vermutlich die Frage ist, ob so eine quasi doppelte Verneinung semantisch sinnvoll wäre.
Warum eigentlich doppelte Verneinung? Zuerst sucht man die entspr. Zeichen und dann verneint man sie. Ist für mich ein ja-nein.
Ja, das hatte ich auch im Hinterkopf und schrub deshalb "quasi" doppelte. Aber das trifft es nicht, sondern eben das was du schreibst nicht das und nicht das, wobei etwas + etwas gleich doppelt etwas und somit dann doch sowas wie eine doppelte Verneinung, quasi? Gut, definiere quasi und es ist nicht mehr allzu früh für mich (auch doppelt veneint?).
Trotzdem Schade, dass es keine &-Verknüpfungen in Regexp gibt…
Ja, so dachte ich auch schon.
Dank und Gruß,
frankx
gudn tach!
/^([^a]{3}|[^b]{3})/
nein. bbb wird von [^a]{3}\ gematcht und aaa von [^b]{3}.
Stimmt, das wäre wohl immer true.
nein. auf strings mit weniger als drei zeichen wuerde der ausdruck nicht matchen.
Bleibt also doch nur noch die anschließende Invertierung…
...oder die zero-width negative look-ahead assertions.
prost
seth
Hallo D.R.,
So geht das AFAIK nicht, weil das „^“ nur in eckigen Klammer als Verneinung gilt.
Achja richtig...
Meine Regex-Kenntnisse liegen wohl schon etwas zurück...
Gruß,
Dodwin
gudn tach!
Am Anfang darf nicht aaa oder bbb vorkommen. [...]
^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss.
ja, wobei ".*" am schluss ueberfluessig ist.
Wie aber kommt die Verneinung dazu?
das ist je nach sprache unterschiedlich. die einfachste methode waere, z.b. in perl statt
if(/^(aaa|bbb)/)
mach wadd
eben
unless(/^(aaa|bbb)/)
mach wadd
prost
seth