Ich möchte die Situation mit regulärem Ausdruck in Perl verstehen.Warum bricht ein Wort die richtige Ausgabe in Regex (Perl)?
$str = "123-abc 23-rr";
Sie müssen beide Wörter neben Minus anzeigen. Regulärer Ausdruck ist:
@mas=$str=~/(?:([\d\w]+)\-([\d\w]+))/gx;
Und es richtig Ausgabe zeigen: 123
, abc
, 23
, rr
. Aber wenn ich Zeichenfolge ein wenig und legte ein Wort in Start ändern:
$str = "word 123-abc 23-rr";
Und ich möchte, nehmen Sie dieses erste Wort-Konto, so dass ich meine regexp ändern:
@mas=$str=~/\w+\s(?:\s*([\d\w]+)\-([\d\w]+))*/gx;
Mein Ausgang muss gleich sein , aber es gibt: 23
, rr
. Wenn ich \s*
oder *
entferne, ist der Ausgang 123
, abc
. Aber es ist immer noch nicht richtig. Wer weiß warum?
Sie können über lesen * Erfassung wiederholten Gruppen * [hier] (http://www.regular-expressions.info/captureall.html) –
Wenn Sie einen bestimmten Anfang Eingabezeichenfolge angeben, können Sie nicht Tell Engine, um eine 'globale' Übereinstimmung für einen Teil der Regex zu erstellen. – revo
Siehe auch [Wiederholte Erfassung und Analyse] (http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-parsing.html). Beachten Sie, dass es nicht das erste '\ w +' ist, das der "Täter" ist, sondern der '*' Quantifizierer, den Sie in der nicht-einfangenden Gruppe gesetzt haben. –