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
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
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.
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.
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.
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.
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.
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
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.
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
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.
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
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.
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
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.
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
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
© 1998-2006
Impressum, Software: Classic Forum