Discussion:
Reguläre Ausdrücke - Zeichenfolge ausschließen
(zu alt für eine Antwort)
Martin Mücke
2007-10-15 10:20:20 UTC
Permalink
Hallo, brauche einen regulären Ausdruck - er soll:

Alle Strings "erlauben", die nicht mit "auto_" beginnen.

Also ok wäre:
auto
autobahn
1
a
1234
abcdefgh
a1b2

nicht ok wäre:
auto_
auto_1
auto_a
auto_1234
auto_abcdefgh
auto_a1b2

Habe zu regulären Ausdrücken ein ziemlich cooles Tutorial gefunden:
http://www.danielfett.de/df_artikel_regex.html

Dort steht unter anderem:
.*(?<!Müll)eimer

Auf Basis dessen habe ich mir dann gebaut:
(?<!auto_)[0-9A-Za-z_+\-]+

Was aber leider nicht funktioniert - ich vermute, weil der
Nachfolgestring, definiert durch "0-9A-Za-z_+\-"
eben theoretisch auch "auto_" sein könnte! D.h. die Regel sagt so
gesehen beginne nicht mit auto_ aber dann kannst du "auto_schreiben!!!

Irgendeine Ahnung, wie man das hinkriegen kann?

Danke,

Martin
David Fuhr
2007-10-15 10:52:59 UTC
Permalink
Post by Martin Mücke
Alle Strings "erlauben", die nicht mit "auto_" beginnen.
Was spricht gegen !preg_match('/^auto_/', $string)
Martin Mücke
2007-10-15 11:31:15 UTC
Permalink
Das ich nur reguläre Ausdrücke und kein PHP verwenden kann.
Oliver Grätz
2007-10-16 03:18:55 UTC
Permalink
Post by Martin Mücke
Das ich nur reguläre Ausdrücke und kein PHP verwenden kann.
Dann ist das hier OT. *g*

OK, versuch's mal mit [^a][^u] usw., ich glaube besser geht Negieren
hierbei leider nicht, da trauere ich ja immer noch der guten alten
Amiga-Shell nach...

OLLi
--
"Well, lady I must say-- (admiring smile) You're my kinda stupid."
[Mal, firefly 113]
Helmut Richter
2007-10-16 07:10:48 UTC
Permalink
Post by Oliver Grätz
OK, versuch's mal mit [^a][^u] usw., ich glaube besser geht Negieren
hierbei leider nicht, da trauere ich ja immer noch der guten alten
Amiga-Shell nach...
siehe auch:

http://www.lrz.de/services/schulung/unterlagen/regul/regul-14.html#publish4.3.4.0.0.0
--
Helmut Richter
Daniel Fett
2007-10-16 08:08:40 UTC
Permalink
Post by Oliver Grätz
Post by Martin Mücke
Das ich nur reguläre Ausdrücke und kein PHP verwenden kann.
Dann ist das hier OT. *g*
OK, versuch's mal mit [^a][^u] usw., ich glaube besser geht Negieren
hierbei leider nicht, da trauere ich ja immer noch der guten alten
Amiga-Shell nach...
Du meinst
^[^a][^u][^t][^o][^_] ?
Das ist Quark, weil das auch z.b. motorrad rausfiltern (also verbieten)
würde. Eine Lösung habe ich nebenan schon genannt.

Daniel
Martin Mücke
2007-10-15 11:37:31 UTC
Permalink
Das ich nur reguläre Ausdrücke und kein PHP verwenden kann (Wird
verwendet für Tool ähnlich mod rewrite)
Gregor Kofler
2007-10-15 12:08:30 UTC
Permalink
Post by Martin Mücke
Das ich nur reguläre Ausdrücke und kein PHP verwenden kann (Wird
verwendet für Tool ähnlich mod rewrite)
Hä?

preg_* arbeitet mit regulären Ausdrücken. Also das zwischen '/ und /'
ist ein regulärer Ausdruck.

Und wenn dich PHP nicht interessiert - warum fragst du in einer PHP-Gruppe?

Gregor
--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Harald Stowasser
2007-10-15 11:49:37 UTC
Permalink
Post by Martin Mücke
Alle Strings "erlauben", die nicht mit "auto_" beginnen.
Du möchtest also
"auto_[0-9A-Za-z_+\-]*"
finden?

Gutes Tool für regex: http://weitz.de/regex-coach/
Daniel Fett
2007-10-15 11:59:35 UTC
Permalink
Post by Martin Mücke
Alle Strings "erlauben", die nicht mit "auto_" beginnen.
...
Post by Martin Mücke
http://www.danielfett.de/df_artikel_regex.html
Vielen Dank für die Blumen ;-)
Post by Martin Mücke
.*(?<!Müll)eimer
(?<!auto_)[0-9A-Za-z_+\-]+
^(?!auto_) sollte es tun. Also ein negative lookahead.

Daniel
Ralph Stahl
2007-10-16 08:15:46 UTC
Permalink
Post by Daniel Fett
Post by Martin Mücke
Alle Strings "erlauben", die nicht mit "auto_" beginnen.
...
Post by Martin Mücke
http://www.danielfett.de/df_artikel_regex.html
Vielen Dank für die Blumen ;-)
Post by Martin Mücke
.*(?<!Müll)eimer
(?<!auto_)[0-9A-Za-z_+\-]+
^(?!auto_) sollte es tun. Also ein negative lookahead.
Daniel
Guckstu:
http://www.regular-expressions.info/lookaround.html

Ralph
Daniel Fett
2007-10-16 09:10:24 UTC
Permalink
Post by Ralph Stahl
Post by Daniel Fett
Post by Martin Mücke
Alle Strings "erlauben", die nicht mit "auto_" beginnen.
...
Post by Martin Mücke
http://www.danielfett.de/df_artikel_regex.html
Vielen Dank für die Blumen ;-)
Post by Martin Mücke
.*(?<!Müll)eimer
(?<!auto_)[0-9A-Za-z_+\-]+
^(?!auto_) sollte es tun. Also ein negative lookahead.
Daniel
http://www.regular-expressions.info/lookaround.html
Wieso teilst du mir das mit?

Daniel
Claus Reibenstein
2007-10-16 10:40:37 UTC
Permalink
Post by Daniel Fett
Post by Ralph Stahl
Post by Daniel Fett
^(?!auto_) sollte es tun. Also ein negative lookahead.
http://www.regular-expressions.info/lookaround.html
Wieso teilst du mir das mit?
Weil das hier eine PHP- und keine Perl-Gruppe ist. Oder kennt PHP dieses
Konstrukt ebenfalls?

Gruß. Claus
Ralph Stahl
2007-10-16 12:02:55 UTC
Permalink
Post by Claus Reibenstein
Post by Daniel Fett
Post by Ralph Stahl
Post by Daniel Fett
^(?!auto_) sollte es tun. Also ein negative lookahead.
http://www.regular-expressions.info/lookaround.html
Wieso teilst du mir das mit?
Weil das hier eine PHP- und keine Perl-Gruppe ist. Oder kennt PHP dieses
Konstrukt ebenfalls?
Gruß. Claus
Ja, auch wenn da "Perl 5" drübersteht. Zumindest bei 5.2 benutze ich es.
Der Link war auch eher für Martin als für Daniel gedacht.

Ralph

Ralph Stahl
2007-10-16 08:38:29 UTC
Permalink
Post by Daniel Fett
Post by Martin Mücke
Alle Strings "erlauben", die nicht mit "auto_" beginnen.
...
Post by Martin Mücke
http://www.danielfett.de/df_artikel_regex.html
Vielen Dank für die Blumen ;-)
Post by Martin Mücke
.*(?<!Müll)eimer
(?<!auto_)[0-9A-Za-z_+\-]+
^(?!auto_) sollte es tun. Also ein negative lookahead.
Daniel
richtiger: ^(?<=auto_)[\d\w]+ , denn es geht ja um "nicht auto_". Tip:
mit http://weitz.de/regex-coach/ kann man das schön ausprobieren.

Ralph
Daniel Fett
2007-10-16 09:09:37 UTC
Permalink
Post by Ralph Stahl
Post by Daniel Fett
Post by Martin Mücke
Alle Strings "erlauben", die nicht mit "auto_" beginnen.
...
Post by Martin Mücke
http://www.danielfett.de/df_artikel_regex.html
Vielen Dank für die Blumen ;-)
Post by Martin Mücke
.*(?<!Müll)eimer
(?<!auto_)[0-9A-Za-z_+\-]+
^(?!auto_) sollte es tun. Also ein negative lookahead.
Daniel
mit http://weitz.de/regex-coach/ kann man das schön ausprobieren.
Wen willst du hier verbessern? Dein Vorschlag ist Unsinn und erfüllt
nicht die im OP genannten Anforderungen.

<?php
$regexes = array('~^(?!auto_)~', '~^(?<=auto_)[\d\w]+~');
$tests = array ('auto_matik', 'automreaktor', 'boot', 'motorrad',
'blub', '', '1', 'auto_12dw');
foreach ($regexes as $regex)
{
echo "<hr>REGEX $regex<br>";
foreach ($tests as $test)
{
echo "auf '$test' trifft der regex ";
if (! preg_match($regex, $test))
{
echo 'nicht';
}
echo "<br>";
}
}
?>

Ausgabe:

REGEX ~^(?!auto_)~
auf 'auto_matik' trifft der regex nicht
auf 'automreaktor' trifft der regex
auf 'boot' trifft der regex
auf 'motorrad' trifft der regex
auf 'blub' trifft der regex
auf '' trifft der regex
auf '1' trifft der regex
auf 'auto_12dw' trifft der regex nicht

REGEX ~^(?<=auto_)[\d\w]+~
auf 'auto_matik' trifft der regex nicht
auf 'automreaktor' trifft der regex nicht
auf 'boot' trifft der regex nicht
auf 'motorrad' trifft der regex nicht
auf 'blub' trifft der regex nicht
auf '' trifft der regex nicht
auf '1' trifft der regex nicht
auf 'auto_12dw' trifft der regex nicht

Daniel
Ralph Stahl
2007-10-16 09:25:37 UTC
Permalink
Post by Daniel Fett
Post by Ralph Stahl
Post by Daniel Fett
Post by Martin Mücke
Alle Strings "erlauben", die nicht mit "auto_" beginnen.
...
Post by Martin Mücke
http://www.danielfett.de/df_artikel_regex.html
Vielen Dank für die Blumen ;-)
Post by Martin Mücke
.*(?<!Müll)eimer
(?<!auto_)[0-9A-Za-z_+\-]+
^(?!auto_) sollte es tun. Also ein negative lookahead.
Daniel
mit http://weitz.de/regex-coach/ kann man das schön ausprobieren.
Wen willst du hier verbessern? Dein Vorschlag ist Unsinn und erfüllt
nicht die im OP genannten Anforderungen.
Ich hab die Anforderung nicht richtig gelesen, sorry.
Ralph
Loading...