Schrift
[thread]6196[/thread]

Reguläre Ausdrücke: richtig interpretieren

Leser: 2


<< >> 7 Einträge, 1 Seite
Patrick
 2004-04-16 11:41
#81614 #81614
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe folgenden Code
Code: (dl )
1
2
3
4
...
if (/^(.+?)\s*#\s*(.*)/)
{
...


Wenn ich das richtig interpretiere kontrolliert diese If-Abfrage, ob in einerm String irgendwo das Zeichen # vorkommt!

Wie ist die Bedeutung aber im einzelnen?

Ich habe es bislang so verstanden:
Die / begrenzen den Regulären Ausdruck.
Die ^ geben an, das die Nachfolgende Zeichenkette am Anfang einer Zeile steht
Der Abschnitt (.+?) sagt aus, dass nach dem Zeichen vor dem . beliebig viele Zeichen kommen können, auch bieliebig wiederholen
Das \s gibt an das ein s (Sonderfunktion von s durch \ aufgehoben) folgt ? ? ? ?
Der * gibt an, dass das vorangestellte Zeichen beliebig oft wiederholt werden kann, in diesem Fall das s
Jetzt folgt das gesuchte Zeichen #
Dann kann mit \s* beliebig viele s folgen ? ?
Mit (.+?) geb ich an, das beliebig viele Zeichen folgen können
Der \ beendet den Bereich des Regulären Ausdrucks

Ich hoffe ich habe das richtig verstanden!
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
format_c
 2004-04-16 11:53
#81615 #81615
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
if (
/
^ # Zusicherung dass das Musster auf den Anfang der Zeichenkette passt
(.+?)# matcht einen oder mehr Character (minimales Matching) und Captured diese in $1
\s* # matcht null oder mehr Whitespaces (maximales Matching)
\# # matcht #
\s* # matcht null oder mehr Whitespaces (maximales matching)
(.*) # matcht null oder mehr Character(maximales matching) und captured diese in $2
/x # erlaubt diese Schreibweise
) {
...


Gruß alex\n\n

<!--EDIT|format_c|1082102131-->
Knuddlbaer
 2004-04-16 12:05
#81616 #81616
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
(.+?)# matcht einen oder mehr Character (minimales Matching) und Captured diese in $1


Braucht man das ? da überhaupt ?
Das .+ sagt aus das mindestens 1 beliebiges Zeichen folgen muss (bis unendlich) und ? sagt das es kein oder einmal vorhanden sein muss ?!
Patrick
 2004-04-16 12:07
#81617 #81617
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Klasse, Danke!
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
format_c
 2004-04-16 12:14
#81618 #81618
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=Knuddlbaer,16.04.2004, 10:05]
Code: (dl )
(.+?)# matcht einen oder mehr Character (minimales Matching) und Captured diese in $1


Braucht man das ? da überhaupt ?
Das .+ sagt aus das mindestens 1 beliebiges Zeichen folgen muss (bis unendlich) und ? sagt das es kein oder einmal vorhanden sein muss ?![/quote]
Das ? hat eine andere Bedeutung wenn es hinter einem Multimatching Operator steht.
Kommt auf die zu matchende Zeichen kette an und was genau gematcht werden soll.
Das kleine Testscript sollte dir zeigen warum man da ? grauchen könnte:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use strict;
my $string = q'hier steht der text den ich in $1 haben möchte# Ab hier soll er in $2 aufgenommen werden # gelle';
print "Versuch mit minimalen Patternmatching:\n";
$string =~ /^(.+?)\s*#\s*(.*)/;
print "\$1: $1\n";
print "\$2: $2\n";
print "----\n";
print "Versuch mit maximalen Pattermatching\n";
$string =~ /^(.+)\s*#\s*(.*)/;
print "\$1: $1\n";
print "\$2: $2\n";
print "----\n";


Gruß Alex\n\n

<!--EDIT|format_c|1082103383-->
Strat
 2004-04-16 12:30
#81619 #81619
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Knuddlbaer,16.04.2004, 10:05]Braucht man das ? da überhaupt ?
Das .+ sagt aus das mindestens 1 beliebiges Zeichen folgen muss (bis unendlich) und ? sagt das es kein oder einmal vorhanden sein muss ?![/quote]
wie format_c schon andeutete: das problem bei .+ oder .* ist, dass perl versucht, da moeglichst viele zeichen zu erwischen. Um da so wenig Zeichen wie moeglich "einzufangen", stellt man hinter * oder + ein ?.
Code: (dl )
1
2
3
4
5
6
7
$string = qq~<tag1>text1</tag1><tag1>text2</tag1>~;
if ($string =~ m|<tag1>(.+)</tag1>|) {
print "VIEL: $1\n";
}
if ($string =~ m|<tag1>(.+?)</tag1>|) {
print "WENIG: $1\n";
}

beim erstenmal wird text1</tag1><tag1>text2 ausgegeben, beim zweiten mal nur text1, weil da durch (.+?) so wenig wie moeglich gecaptured (=eingefangen) wird...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Knuddlbaer
 2004-04-16 13:48
#81620 #81620
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
Ah jetzt ja!


Danke schön!
<< >> 7 Einträge, 1 Seite



View all threads created 2004-04-16 11:41.