Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2005 Teil von Juni

SELFHTML Forumsarchiv
Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Informationsseite
  1. Seite (PERL) Regulärer Ausdrück: Zahl zwischen 0 und 100 finden von Michael, 11. 06. 2005, 12:00
nach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Michael, 11. 06. 2005, 12:00

Hallo Allerseits,

weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

Viele Grüße
Michael

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Yzerman, 11. 06. 2005, 12:13

#\d{1,3}#



»» Hallo Allerseits,
»»
»» weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?
»»
»» Viele Grüße
»» Michael

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: MudGuard, 11. 06. 2005, 12:14

Hi,

»» #\d{1,3}#

Das findet auch Zahlen, die größer als 100 sind.

cu,
Andreas
--
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter

Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Siechfred, 11. 06. 2005, 12:15

Tag Michael.

»» weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

So aus der Kalten:

$text =~ /(\d{1,3})/;
$treffer = $1;


Wenn du alle Zahlen finden willst, sollte dir der Listenkontext helfen:

@treffer = $text =~ /\d{1,3}/g;
print join(";",@treffer);


Das Ergebnis: http://anaboe.net/cgi-bin/test.pl.

Siechfred
--
Everybody's going to the party have a real good time,
Dancing in the desert blowing up the sunshine.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: MudGuard, 11. 06. 2005, 12:17

Hi,

»» $text =~ /(\d{1,3})/;
»» $treffer = $1;


Gleicher Fehler wie bei Yzerman.

cu,
Andreas
--
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter

Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Siechfred, 11. 06. 2005, 12:17

Tag Michael.

»» $text =~ /(\d{1,3})/;
»» $treffer = $1;


*argh* da habe ich doch glatt die Begrenzung auf 100 übersehen, sorry.

Siechfred
--
Everybody's going to the party have a real good time,
Dancing in the desert blowing up the sunshine.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: MudGuard, 11. 06. 2005, 12:15

Hi,

»» weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

Da müßtest Du schon genauer spezifizieren.

Was steht vor/nach den Zahlen im Text?
Was bedeutet zwischen 0 und 100? Ist das inklusive der 0 und inklusive der 100?
Oder exklusive 0 und exklusive 100?

cu,
Andreas
--
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter

Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Christian Seiler, 11. 06. 2005, 12:18

Hallo Michael,

»» weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

Inklusive 100 und 0 und alleinstehend:

$text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;

Viele Grüße,
Christian

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Siechfred, 11. 06. 2005, 12:27

Tag Christian.

»» $text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;

Ich werde die Lookbehind-Konstrukte auch noch irgendwann kapieren :-/
Jedenfalls habe ich die Testseite anhand deines Regulären Ausdrucks geändert, und siehe da, es funktioniert.

Siechfred
--
Everybody's going to the party have a real good time,
Dancing in the desert blowing up the sunshine.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Christian Seiler, 11. 06. 2005, 12:45

Hallo Siechfred,

»» »» $text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;
»»
»» Ich werde die Lookbehind-Konstrukte auch noch irgendwann kapieren :-/

So schwer ist das auch nicht:

(?<!TEXT) ist eine negative lookbehind assertion. Die sorgt dafür, dass _vor_ dem String, der gematcht wird, TEXT *nicht* vorkommen darf. Allerdings matcht (?<!TEXT) nicht auf TEXT, d.h. die Länge der Assertion ist 0 und TEXT ist somit *nicht* Teil des gesamten gematchten Strings.

/(?<!ASP) ist toll/ findet also die Zeichenkette " ist toll" sofern davor *nicht* "ASP" steht.

Das Gegenteil davon ist die lookbehind assertion:

/(?<=Perl) ist toll/ findet die Zeichenkette " ist toll" - aber nur dann, wenn "Perl" davorsteht.

Genauso gibt es lookahead assertions:

/Du bist (?!doof)/ findet die Zeichenkette "Du bist " sofern da *nicht* "doof" dahinter steht.

/Du bist (?=ein Freak)/ findet die Zeichenktte "Du bist " - aber nur dann, wenn "ein Freak" dahinter steht.

Diese Assertions können auch in anderen Situationen nützlich sein. Du willst bspw. jedes Wort finden, das fünf Buchstaben hat aber *nicht* Linux ist:

$text =~ /\b(?!Linux)(\w{5})\b/

(\b ist die Wortgrenze)

Viele Grüße,
Christian

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Siechfred, 11. 06. 2005, 13:18

Tag Christian.

»» /(?<!ASP) ist toll/ findet also die Zeichenkette " ist toll" sofern davor *nicht* "ASP" steht.

Ja, das Prinzip ist mir schon klar, aber ich verstehe den Sinn von Lookbehind nicht. Das würde man nämlich (in Perl) auch so erreichen: '/(?!ASP) ist toll/'. Wenn ich das Ganze mal teste, funktioniert es:

# der Satz
$text = 'Heute war ich 3mal in 12345 Willihausen, um 25 Brote in der Bäckerei "42", Hauptstraße 101, zu kaufen, doch 0 Chance.';

# Skalarer Kontext
$text =~ /(?=\b)(100|\d{1,2})(?=\b)/;
$treffer = $1;
# Ausgabe: 25

# Listenkontext
@treffer = $text =~ /(?=\b)(100|\d{1,2})(?=\b)/g;
print join(",",@treffer);
# Ausgabe: 25,42,0


Wobei es natürlich auf die Vorgabe von Michael ankommt, also ob er allein stehende Zahlen zwischen 0 und 100 oder auch solche Sachen wie '3mal' finden will. Aber wie gesagt, wo ist jetzt der feine Unterschied?

Siechfred
--
Everybody's going to the party have a real good time,
Dancing in the desert blowing up the sunshine.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Christian Seiler, 11. 06. 2005, 13:40

Hallo Siechfred,

»» »» /(?<!ASP) ist toll/ findet also die Zeichenkette " ist toll" sofern davor *nicht* "ASP" steht.
»»
»» Ja, das Prinzip ist mir schon klar, aber ich verstehe den Sinn von Lookbehind nicht. Das würde man nämlich (in Perl) auch so erreichen: '/(?!ASP) ist toll/'.

Nein, würde man nicht. Beispiel:

#!/usr/bin/env perl

use strict;
use warnings;

my ($text, $match1, $match2);

$text = "Hallo, ASP ist toll!";

$match1 = $text =~ /(?!ASP) ist toll/;
$match2 = $text =~ /(?<!ASP) ist toll/;

print "Match 1: " . $match1 . "\n";
print "Match 2: " . $match2 . "\n";


Ausgabe:

Match 1: 1
Match 2:

Match 1 matcht den String, weil "(?!ASP) is" *immer* matcht. (" is" ist natürlich nicht das gleiche, wie "ASP") - (?!) ist eben eine Look-AHEAD-Assertion. Du brauchst hier aber eine Look-BEHIND-Assertion - was (?<!) eben leistet - deswegen matcht der 2. Ausdruck nichts. Klar?

»» Wenn ich das Ganze mal teste, funktioniert es:

Ja, weil \b etwas besonderes ist; bei \b ist es Quatsch, das in eine Assertion reinzutun, weil es selbst schon gleichzeitig eine Lookahead/Lookbehind-Assertion ist! (je nach Kontext)

Viele Grüße,
CHristian

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Siechfred, 11. 06. 2005, 15:00

Tag Christian.

»» $match1 = $text =~ /(?!ASP) ist toll/;
»» $match2 = $text =~ /(?<!ASP) ist toll/;

Ah, ich glaube, dass ich langsam dahintersteige. Zum Verständnis:

Variante 1: "Finde eine Position, an der nicht 'ASP' steht, aber ' ist toll'"
Variante 2: "Finde eine Position, an der ' ist toll' steht, aber nur dann, wenn davor nicht 'ASP' steht"

Ist das jetzt so richtig?

Siechfred
--
Everybody's going to the party have a real good time,
Dancing in the desert blowing up the sunshine.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Christian Seiler, 11. 06. 2005, 15:10

Hallo Siechfred,

»» Variante 1: "Finde eine Position, an der nicht 'ASP' steht, aber ' ist toll'"
»» Variante 2: "Finde eine Position, an der ' ist toll' steht, aber nur dann, wenn davor nicht 'ASP' steht"
»»
»» Ist das jetzt so richtig?

Ja.

Viele Grüße,
Christian

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Siechfred, 11. 06. 2005, 18:01

Tag Christian.

Danke für deine Geduld.

Siechfred
--
Everybody's going to the party have a real good time,
Dancing in the desert blowing up the sunshine.

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Christian Seiler, 11. 06. 2005, 18:24

Hallo Siechfred,

»» Danke für deine Geduld.

Och, das war doch kein Thema. ;-)

Viele Grüße,
Christian

nach obennach unten

Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Die folgende Nachricht zum Thema stammt von: Michael, 11. 06. 2005, 12:29

»» $text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;

Danke Christian! Das wars :-)

Liebe Grüße
Michael

nach oben
Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2005 Teil von Juni

© 1998-2006 Seite Impressum, Software: Classic Forum