Regulärer Ausdrück: Zahl zwischen 0 und 100 finden
Michael
- perl
-1 Yzerman0 MudGuard
-1 Siechfred1 MudGuard2 Christian Seiler
Hallo Allerseits,
weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?
Viele Grüße
Michael
#\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
Hi,
#\d{1,3}#
Das findet auch Zahlen, die größer als 100 sind.
cu,
Andreas
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
Hi,
$text =~ /(\d{1,3})/;
$treffer = $1;
Gleicher Fehler wie bei Yzerman.
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://www.Mud-Guard.de/)
[Schreinerei Waechter](http://www.schreinerei-waechter.de/)
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
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.
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
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
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
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
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
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
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
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
Tag Christian.
Danke für deine Geduld.
Siechfred
Hallo Siechfred,
Danke für deine Geduld.
Och, das war doch kein Thema. ;-)
Viele Grüße,
Christian
$text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;
Danke Christian! Das wars :-)
Liebe Grüße
Michael