Wie kann ich das extrahieren einer Teilzeichenkette bis zum ersten Ziffer?
Wie finde ich den ersten Teilstring, bis ich die erste Ziffer?
Beispiel:
my $string = 'AAAA_BBBB_12_13_14' ;
Ergebnis erwartet: 'AAAA_BBBB_'
- Wow. Jede Antwort, so weit ist es falsch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausgehend von den tags, die Sie möchten, um einen regulären Ausdruck verwenden. So bauen wir dieses.
^
Metazeichen am Anfang\D
+
- Quantifizierer was bedeutet 1 oder mehr von dem vorherigen Teil des Musters.Dieser gibt uns der folgende reguläre Ausdruck:
Können, die wir im code verwenden, etwa so:
/(\d)/ - regex, which search FIRST digit in string
und nach dieser haben Sie $` - var, die Zeichenfolge vor dem matching$str =~ /(\d)/ and foo($`) or foo2();
$&
wird verlangsamen alle Ihre Spiele mit ihm sehr gut bekannten performance-Problem. Sie brauchen es nicht hier. Verwenden Sie einfach eine Aufnahme.Die meisten Menschen haben die Hälfte der Antwort richtig, aber Sie übersehen einige wichtige Punkte.
Vertrauen kannst du nur die match-Variablen nach einem erfolgreichen match. Verwenden Sie Sie nicht, es sei denn, Sie wissen, Sie hatten einen erfolgreichen match.
Den
$&
,$``, and
$" haben bekannte Leistungseinbußen über alle regexes in Ihrem Programm.Müssen Sie verankern das match auf den Anfang der Zeichenkette. Da Perl hat nun Benutzer einstellbaren Standard-match-flags, die Sie möchten, zu bleiben Weg von der
^
Anfang der Zeile verankern. Die\A
Anfang der Zeichenfolge Anker nicht ändern, was es tut, auch mit Standard-flags.Dieser funktionieren würde:
Wenn Sie wirklich wollten, um so etwas wie
$&
, Perl 5.10 pro-match-version statt. Die/p
Schalter stellt nicht-globalen-perfomance-saugen-Versionen:Wenn Sie sind besorgt über das, was vielleicht in
\D
können Sie die Charakter-Klasse selbst statt mit dem shortcut:Ich nicht besonders wie der bedingte operator hier, so würde ich wahrscheinlich das Spiel in der Liste Kontext:
Wenn es sein muss eine Zahl im string (damit Sie nicht übereinstimmen, eine ganze Zeichenfolge, die keine Ziffern sehen, können Sie werfen in einer lookahead-Funktion, die nicht Teil des capture:
/\A(\D*)/ && $1
mich. Sehe nicht ein, warum die Mühe mit einem/(pat)/ ? $1 : undef
die meisten der Zeit, gegeben, dass&& $1
ist in der Regel gut genug. Menschen, die nicht verwenden&&
so viel für seine string-potential, wie Sie es könnten.Dieser code drucken Zeichenfolge, die vor dem matching
$str =~ /(\d)/; print $`
$string = 'AAAA_BBBB'
würde ich erwarten, dass'AAAA_BBBB'
zurückgegeben werden, aber dieser einen leeren string zurück, da es keine Ziffer zu entsprechen.$str=~/(\d)/ and print $` or print $str;