Hilfe mit regulärem Ausdruck

Hilfe mit regulärem Ausdruck

am 28.08.2006 11:57:08 von Alex Hepp

Hallo NG,

ich weiss, dass es eigentlich nicht ganz hierher gehört, aber ich habe
ein Problem mit einem regulärem Ausdruck, und vielleicht hat ja hier
jemand eine Idee...

Ich habe einen String, in dem an einer bestimmten Stelle keine bestimmte
Anzahl 0 vorkommen dürfen...

Beispiel: 8 * 0
abc00000000abc => soll nicht gematcht werden.
abc00030000abc => soll gematcht werden.

Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden von
0 vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?

lg. Alex

Re: Hilfe mit regulärem Ausdruck

am 28.08.2006 12:12:49 von Alex Hepp

Alex Hepp schrieb:
> [...]
> Beispiel: 8 * 0
> abc00000000abc => soll nicht gematcht werden.
> abc00030000abc => soll gematcht werden.
>

Also, eine mögliche Lösung hab ich gefunden, allerdings sieht das mir
sehr "gebastelt" aus. Das muss doch auch irgendwie anders gehen, oder?
Steh irgendwie auf dem Schlauch:

([1-9][0-9]{7}|0[1-9][0-9]{6}|00[1-9][0-9]{5}|000[1-9][0-9]{ 4}|0000[1-9][0-9]{3}|00000[1-9][0-9]{2}||000000[1-9][0-9]{1} |0000000[1-9])

Re: Hilfe mit regulärem Ausdruck

am 28.08.2006 12:15:11 von Helmut Chang

Alex Hepp schrieb:

> Ich habe einen String, in dem an einer bestimmten Stelle keine bestimmte
> Anzahl 0 vorkommen dürfen...
>
> Beispiel: 8 * 0
> abc00000000abc => soll nicht gematcht werden.
> abc00030000abc => soll gematcht werden.

Immer genau das Schema?

substr($str, 3, 8) !== '00000000';

In eine Funktion gepackt kann man das über deren Parameter dynamisieren.

gruss, heli

Re: Hilfe mit regulärem Ausdruck

am 28.08.2006 12:18:16 von Alex Hepp

Hallo Helmut,

Helmut Chang schrieb:
> Immer genau das Schema?

Ja, genau das Schema! 8 Stellen, von denen 1 verschieden von 0 sein
muss... Allerdings eben auch nicht jedes Zeichen, sondern zb. nur
Ziffern und auch keine Whitespaces etc.

> substr($str, 3, 8) !== '00000000';
> In eine Funktion gepackt kann man das über deren Parameter dynamisieren.

Gute Idee, weiss, was Du meinst, allerdings MUSS der Match bereits über
den RegExp passieren.

>
> gruss, heli

vielen dank trotzdem...
alex

Re: Hilfe mit regulärem Ausdruck

am 28.08.2006 15:09:11 von Sebastian Wessel

Alex Hepp schrieb:
> Ich habe einen String, in dem an einer bestimmten Stelle keine bestimmte
> Anzahl 0 vorkommen dürfen...
>
> Beispiel: 8 * 0
> abc00000000abc => soll nicht gematcht werden.
> abc00030000abc => soll gematcht werden.
>
> Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden von
> 0 vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?

Also wenn ich mich jetzt weit aus dem Fenster rauslehne (liegt auch
schon 2 oder 3 Semester zurück), dann ist der Ausdruck, um die 8 Nullen
zu finden

[0]{8}

Wie du das jetzt mit preg, ereg, ... machst musst du leider wieder
selbst herausfinden, da habe ich mich bisher zum Glück nie mit befasst.


--
MfG Sebastian Wessel

"Wer Dich wegen deines Hemdes verprügelt ist nicht dein Freund."
(March Simpson)

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 01:28:49 von Clemens Hammacher

Hallo Alex!

Alex Hepp schrieb:
> Beispiel: 8 * 0
> abc00000000abc => soll nicht gematcht werden.
> abc00030000abc => soll gematcht werden.
>
> Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden von
> 0 vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?

/^abc[0-9]*[1-9][0-9]*abc$/
könnte passen.


Gruß

Clemens

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 10:41:17 von Frank Schenk

Clemens Hammacher wrote:
> Hallo Alex!
>=20
> Alex Hepp schrieb:
>> Beispiel: 8 * 0
>> abc00000000abc =3D> soll nicht gematcht werden.
>> abc00030000abc =3D> soll gematcht werden.
>>
>> Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden v=
on
>> 0 vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?
>=20
> /^abc[0-9]*[1-9][0-9]*abc$/
> könnte passen.

Kommt drauf an, was du matchen willst, dein Ausdruck tut bei:

abc1abc
oder
abc000000000000000000000000000000000000000000000000000000000 0000001000000=
000000000000000000000000000000abc

gruß, Frank

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 11:05:59 von Alex Hepp

Frank Schenk schrieb:
> Clemens Hammacher wrote:
>> Hallo Alex!
>>
>> Alex Hepp schrieb:
>>> Beispiel: 8 * 0
>>> abc00000000abc => soll nicht gematcht werden.
>>> abc00030000abc => soll gematcht werden.
>>>
>>> Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden von
>>> 0 vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?
>>
>> /^abc[0-9]*[1-9][0-9]*abc$/
>> könnte passen.
>
> Kommt drauf an, was du matchen willst, dein Ausdruck tut bei:
>
> abc1abc
> oder
> abc000000000000000000000000000000000000000000000000000000000 0000001000000000000000000000000000000000000abc

Eben! Es geht eben darum, dass in genau den nächsten 8 Zeichen mind.
eine von 0 verschiedene Ziffer vorkommt... Ich krieg normalerweise
eigentlich (fast) jede RegExp irgendwann hin, aber die hier macht mir
echt zu schaffen... wie gesagt, eine Lösung dafür hab ich, aber
irgendwie gefällt mir die nicht! ;)

Trotzdem vielen Dank für die Mühen!
Alex

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 15:23:59 von Clemens Hammacher

Alex Hepp schrieb:
> Frank Schenk schrieb:
>> Clemens Hammacher wrote:
>>> Hallo Alex!
>>>
>>> Alex Hepp schrieb:
>>>
>>>> Beispiel: 8 * 0
>>>> abc00000000abc => soll nicht gematcht werden.
>>>> abc00030000abc => soll gematcht werden.
>>>>
>>>> Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden
>>>> von
>>>> 0 vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?
>>>
>>>
>>> /^abc[0-9]*[1-9][0-9]*abc$/
>>> könnte passen.
>>
>> Kommt drauf an, was du matchen willst, dein Ausdruck tut bei:
>>
>> abc1abc
>> oder
>> abc000000000000000000000000000000000000000000000000000000000 0000001000000000000000000000000000000000000abc
>
> Eben! Es geht eben darum, dass in genau den nächsten 8 Zeichen mind.
> eine von 0 verschiedene Ziffer vorkommt...

Aus der Hüfte geschossen:
if (preg_match('/^abc([0-9]{8})abc$/', 'abc00400000abc', $matches) &&
($matches[1] != str_repeat('0', 8))) { ...

Ist das so wie du es dir gedacht hast?

Clemens

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 15:51:22 von Alex Hepp

Hallo Clemens,

Clemens Hammacher schrieb:
> Aus der Hüfte geschossen:
> if (preg_match('/^abc([0-9]{8})abc$/', 'abc00400000abc', $matches) &&
> ($matches[1] != str_repeat('0', 8))) { ...

Aus der Hüfte trifft man meist nicht so gut, wie aus der Hocke über
Kimme und Korn ;)

>
> Ist das so wie du es dir gedacht hast?

leider nicht ganz, denn bereits der reguläre Ausdruck MUSS die
Entscheidung treffen (ist zum Einen halt eine Anforderung, und nein, es
ist keine Hausaufgabe und zum Anderen kann ich einfach nicht glauben,
dass das nur durch ein Konstrukt wie in meiner ersten Antwort durch
regexp zu lösen ist ;) )

aber ansonsten würde das IMHO so funktionieren, danke für den Hinweis!

Gruß alex

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 18:26:25 von Carsten Wiedmann

Alex Hepp schrieb:

> Ich habe einen String, in dem an einer bestimmten Stelle keine bestimmte
> Anzahl 0 vorkommen dürfen...
>
> Beispiel: 8 * 0
> abc00000000abc => soll nicht gematcht werden.
> abc00030000abc => soll gematcht werden.
>
> Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden von 0
> vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?

Sollte eigentlich so zu machen sein:
| ^.*[0-9]{8}(?
Gruß
Carsten

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 18:38:52 von Frank Schenk

Carsten Wiedmann wrote:
> Alex Hepp schrieb:
>=20
>> Ich habe einen String, in dem an einer bestimmten Stelle keine=20
>> bestimmte Anzahl 0 vorkommen dürfen...
>>
>> Beispiel: 8 * 0
>> abc00000000abc =3D> soll nicht gematcht werden.
>> abc00030000abc =3D> soll gematcht werden.
>>

> Sollte eigentlich so zu machen sein:
> | ^.*[0-9]{8}(? >=20

Hast du den mal getestet? Ich seh da auf den ersten Blick 2 Stolperfallen=


Wie wärs mit:

~^[^\d]*[0-9]{8}(?
gruß, Frank

P.S.: Ja, der lookahead oder lookbehind ist hier die einzige Möglichkei=
t

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 19:32:37 von Alex Hepp

Frank Schenk schrieb:
> Carsten Wiedmann wrote:
>> Alex Hepp schrieb:
>>
>>> Ich habe einen String, in dem an einer bestimmten Stelle keine
>>> bestimmte Anzahl 0 vorkommen dürfen...
>>>
>>> Beispiel: 8 * 0
>>> abc00000000abc => soll nicht gematcht werden.
>>> abc00030000abc => soll gematcht werden.
>>>
>
>> Sollte eigentlich so zu machen sein:
>> | ^.*[0-9]{8}(? >>
>
> Hast du den mal getestet? Ich seh da auf den ersten Blick 2 Stolperfallen.
>
> Wie wärs mit:
>
> ~^[^\d]*[0-9]{8}(? >
> gruß, Frank
>
> P.S.: Ja, der lookahead oder lookbehind ist hier die einzige Möglichkeit


Na, das sieht doch eigentlich schon sehr gut aus... Frank hat Recht, im
Beispiel von Carsten müsste man wohl noch dem ersten * ein ungreedy flag
mitgeben, sodass sofort die erste Ziffer auch dem Ziffernbereich
matcht... Aber geht das auch danach? Sonst würden eben auch 9+ 0en
gematcht ;)

Da man das aber eben auch mit dem \d erreicht, gratulier ich Dir Frank,
Du hast den Job ;)

Vielen Dank für Eure Mühen.
gruß Alex

Re: Hilfe mit regulärem Ausdruck

am 29.08.2006 21:36:19 von Niels Braczek

Alex Hepp schrieb:

> Ich habe einen String, in dem an einer bestimmten Stelle keine bestimmt=
e=20
> Anzahl 0 vorkommen dürfen...
>=20
> Beispiel: 8 * 0
> abc00000000abc =3D> soll nicht gematcht werden.
> abc00030000abc =3D> soll gematcht werden.
>=20
> Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden vo=
n=20
> 0 vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?

Nur eine Idee (ungetestet):

Achtmal 0 soll nicht erkannt werden =3D> höchstens siebenmal 0 soll
erkannt werden.

\D*0{,7}[1-9]+0{,7}\D*

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Hilfe mit regulärem Ausdruck

am 30.08.2006 09:58:43 von Alex Hepp

Niels Braczek schrieb:
> Alex Hepp schrieb:
>
>> Ich habe einen String, in dem an einer bestimmten Stelle keine bestimmte
>> Anzahl 0 vorkommen dürfen...
>>
>> Beispiel: 8 * 0
>> abc00000000abc => soll nicht gematcht werden.
>> abc00030000abc => soll gematcht werden.
>>
>> Heisst: In einem bestimmten Bereich soll mind. 1 Zeichen verschieden von
>> 0 vorkommen. Wie kann ich das quantifizieren? Hat jemand eine Idee?
>
> Nur eine Idee (ungetestet):
>
> Achtmal 0 soll nicht erkannt werden => höchstens siebenmal 0 soll
> erkannt werden.
>
> \D*0{,7}[1-9]+0{,7}\D*
>
> MfG
> Niels
>
Nein, nein,nein, so nicht ;) Sorry, aber danke, aber so werden eben auch
beispielsweise:

000000010000000 gematcht... Die Sache ist ja, dass eben an diesen GENAU
8 Stellen mind. ein von 0 verschiedenes Zeichen vorkommen soll. Es kann
eben sein, dass nach den 8 Stellen eben auch noch Ziffern kommen... Es
geht um genau 8 Stellen...