Frage

Ich wurde Lesen diese Frage über wie zu analysieren URLs von web-Seiten und hatte eine Frage über die akzeptierte Antwort die angebotene Lösung:

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

Die Lösung wurde angeboten csmba und er führte es auf regexlib.com.Puh.Credits gemacht.

Ich denke, dies ist eine ziemlich naive regulären Ausdruck, aber es ist ein schöner Ausgangspunkt für den Aufbau etwas besser.Aber, meine Frage ist:

Was ist der Punkt von {1}?Es bedeutet "genau eine der früheren Gruppierung", richtig?Ist das nicht das Standardverhalten von einer Gruppierung, die in einem regulären Ausdruck?Würde der Ausdruck in einer Weise geändert werden, wenn der {1} entfernt wurden?

Wenn ich sah, dass dieser von einem Kollegen möchte ich darauf hinweisen, seine oder Ihre Fehler, aber als ich dies Schreibe die Antwort mit mindestens 6 und der Ausdruck auf regexlib.com bewertet 4 von 5.Also vielleicht bin ich etwas fehlt?

War es hilfreich?

Lösung

@Jeff Atwood, Ihre interpretation ist ein wenig off - die {1} bedeutet genau einmal, aber hat keine Wirkung auf die "Aufnahme" - von der Aufnahme tritt auf, weil die Klammern - die Zahnspange nur festlegen, wie oft das Muster muss mit der Quelle - einmal, als Sie sagen.

Ich Stimme mit @Marius, auch wenn seine Antwort ist ein wenig knapp und kann kommen off als leichtfertig.Reguläre Ausdrücke sind hart, wenn man nicht mit Ihnen, und die {1} die Frage ist nicht ganz Fehler - in Systemen, die es unterstützen, es bedeutet "genau ein match".In diesem Sinne, es ist nicht wirklich etwas tun.

Leider, im Gegensatz zu einem jetzt gelöschten post, es nicht halten Sie die regexp entsprechen http://http://example.org, da die \S+ am Ende wird die übereinstimmung mit einem oder mehreren nicht-whitespace-Zeichen, einschließlich der http://example.org in http://http://example.org (überprüft mit Python 2.5, falls meine regexp Lesen war ausgeschaltet).So, die regexp-gegeben, ist nicht wirklich die beste.Ich bin nicht ein URL-Experte, aber wahrscheinlich etwas beschränken, die Erscheinung ":"und "//"s, nachdem die erste wäre eine notwendige (aber kaum ausreichend), um sicherzustellen, gute URLs.

Andere Tipps

@Rob:Ich Stimme nicht zu.Das zu erzwingen, was Sie Fragen ich glaube, Sie würde benutzen müssen, um negative look-behind, was möglich ist, aber sicherlich nicht in Bezug auf die Verwendung {1}.Weder version des regexp-Adresse, die besonderes Problem.

Lassen Sie den code sprechen:

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, es scheint nicht zu sein, die Sie vorschlagen.

Ich glaube nicht, dass die {1} besitzt keine gültigen Funktion regex.

(**mailto:|(news|(ht|f)tp(s?))://){1}**

Sie sollten dies Lesen als:"erfassen Sie die Sachen in den Klammern genau ein mal".Aber wir don ' T wirklich care über die Erfassung dieser zur späteren Verwendung, z.B. $1 in den Ersatz.Es ist also sinnlos.

Ich glaube nicht, dass es irgendeinen Zweck.Da aber RegEx ist fast unmöglich zu verstehen/zu zerlegen, die Menschen nur selten zeigen Sie Fehler.Das ist wahrscheinlich der Grund, warum niemand darauf hingewiesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top