2008-08-17 5 views
4

Ich lese this question darüber, wie URLs aus Web-Seiten zu analysieren und hatte eine Frage über die accepted answer, die diese Lösung angeboten:Zweck von {1} in diesem regulären Ausdruck url Protokolle anzupassen

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+) 

Die Lösung wurde von csmba angeboten und er es regexlib.com gutgeschrieben. Wütend. Credits gemacht.

Ich denke, das ist ein ziemlich naive regulärer Ausdruck, aber es ist ein guter Ausgangspunkt, um etwas besseres zu bauen. Aber meine Frage ist diese:

Was ist der Sinn von {1}? Es bedeutet "genau eine der vorherigen Gruppierungen", oder? Ist das nicht das Standardverhalten einer Gruppierung in einem regulären Ausdruck? Würde der Ausdruck in irgendeiner Weise geändert werden, wenn die {1} entfernt würde?

Wenn ich dies von einem Mitarbeiter sah, würde ich seinen oder ihren Fehler aufzeigen, aber während ich dies schreibe, wird die Antwort auf eine 6 bewertet und der Ausdruck auf regexlib.com wird mit 4 von 5 bewertet etwas vermissen?

Antwort

1

@Jeff Atwood, Ihre Interpretation ist ein wenig aus - die {1} bedeutet genau einmal übereinstimmen, hat aber keine Auswirkungen auf die "Erfassung" - die Erfassung erfolgt aufgrund der Parens - die Klammern geben nur die Anzahl der Zeiten Das Muster muss mit der Quelle übereinstimmen - einmal, wie du sagst.

Ich stimme @Marius zu, auch wenn seine Antwort ein wenig knapp ist und sich als leichtfertig erweisen könnte. Reguläre Ausdrücke sind schwierig, wenn man sie nicht gewohnt ist, und die {1} in der Frage ist nicht ganz falsch - in Systemen, die sie unterstützen, bedeutet das "genau eine Übereinstimmung". In diesem Sinne macht es eigentlich gar nichts.

Leider, im Gegensatz zu einem inzwischen gelöschten Beitrag, ist es nicht die regexp hält von http://http://example.org passend, da die \ S + am Ende eines oder mehr Nicht-Leerzeichen entsprechen, einschließlich der http://example.org in http://http://example.org (verifiziert mit Python 2.5, nur für den Fall, dass meine Regexp-Lesung ausgeschaltet war). Also, die gegebene Regexp ist nicht wirklich die beste. Ich bin kein URL-Experte, aber wahrscheinlich etwas, das das Aussehen von ":" s und "//" s einschränkt, nachdem das erste notwendig (aber kaum ausreichend) wäre, um gute URLs zu gewährleisten.

2

Ich glaube nicht, dass es irgendeinen Zweck hat. Aber weil RegEx fast unmöglich zu verstehen ist, weisen die Leute selten auf Fehler hin. Das ist wahrscheinlich der Grund, warum niemand sonst darauf hingewiesen hat.

3

@Rob: Ich stimme nicht zu. Um das durchzusetzen, was du verlangst, denke ich, dass du Negativ-Look-Behind verwenden musst, was möglich ist, aber sicherlich nicht mit der Verwendung von {1} zusammenhängt. Keine der beiden Versionen des regulären Ausdrucks adressiert dieses spezielle Problem.

Um den Code zu sprechen zu lassen:

tibook 0 /home/jj33/swap > cat text 
Text this is http://example.com text this is 
Text this is http://http://example.com text this is 
tibook 0 /home/jj33/swap > cat p 
#!/usr/bin/perl 

my $re1 = '((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)'; 
my $re2 = '((mailto\:|(news|(ht|f)tp(s?))\://)\S+)'; 

while (<>) { 
    print "Evaluating: $_"; 
    print "re1 saw \$1 = $1\n" if (/$re1/); 
    print "re2 saw \$1 = $1\n" if (/$re2/); 
} 
tibook 0 /home/jj33/swap > cat text | perl p 
Evaluating: Text this is http://example.com text this is 
re1 saw $1 = http://example.com 
re2 saw $1 = http://example.com 
Evaluating: Text this is http://http://example.com text this is 
re1 saw $1 = http://http://example.com 
re2 saw $1 = http://http://example.com 
tibook 0 /home/jj33/swap > 

Also, wenn es einen Unterschied zwischen den beiden Versionen ist, es ist nicht die, die Sie vorschlagen zu sein scheint.

2

Ich glaube nicht, dass {1} in dieser Regex eine gültige Funktion hat.

(** mailto: |? (News | (ht | f) tp (n)): //) {1} **

Sie sollten dies als lesen: " erbeute das Zeug im Parens genau einmal ".Aber es ist uns nicht wirklich wichtig, das für den späteren Gebrauch zu erfassen, zB $ 1 für den Ersatz. Es ist also sinnlos.

Verwandte Themen