Teil der Tracknummer xxx/yyy einzeln greifen - möglichst kurzer RegEx

Hallo,

in einer bestimmten Sammlung setzt sich die Trackangabe aus der laufenden Nummer und der Gesamtzahl zusammen, also

(...)
9/120
10/120
11/120
(...)

Mit diesem Ausdruck

$num($regexp(%track%,'^(\d*)/(\d*)',$1),3)

kann ich den vorderen Teil, die Tracknummer, greifen und als dreistelligen Wert weiterverarbeiten, und mit

$num($regexp(%track%,'^(\d*)/(\d*)',$2),3)

das gleiche für die Gesamtzahl erledigen, den hinteren Teil.

Unklar ist mir, warum mir das nur so umständlich gelingt, mit einem so langen RegEx-Ausdruck. Vielmehr sollte doch das vorangestellte Akzent-Zirkumflex ('^') ausreichen, um den ersten Teil zu greifen, also

$num($regexp(%track%,'^(\d*)',$1),3) <--- klappt nicht!

und das nachgestellte Dollarzeichen ('$') für die Gesamtzahl, also

$num($regexp(%track%,'(\d*)$',$1),3) <--- klappt nicht!

Das gelingt nicht. Wieso? Diese Aufgabe ist Teil einer umfangreicheren Aufgabe... und irgendwie scheint es mir, als hätte ich ein Verständnisproblem mit den RegEx.

Über einen erhellenden Lichtblick - trotz inzwischen dunklem Abend - würde ich mich sehr freuen.

Gruß & dank an alle!

peilung

Ich glaube nicht, dass das Problem die $regexp ist, sondern $num().
$num wandelt etwas in eine Zahl um - nur ist der / zwischen den beiden Zahlen eben keine Nummer, sondern ein Buchstabe. Und da stoppt dann $num.

Du sagst leider nicht, wo und wie du die Bestandteile weiterverarbeiten willst.
Z.B. ginge ja auch ein "Tag-Feld importieren" für TRACK mit
Formatstring: %track%/%totaltracks%
Dann hast du die Zahlen in eigenen Feldern und kannst weiterspielen.

Guten Abend ohrenkino,

vielen Dank für Deine schnelle Reaktion.

Ich hab das Beispiel mal ohne den $num-Teil wiederholt, um mein Problem zu verdeutlichen.

Mit dem langen Ausdruck kann ich den Teil vor dem Schrägstrich greifen


mit dem kürzeren Ausdruck jedoch nicht


(und ich habe auch schon etwas dazugelernt :slight_smile: )

Und das verstehe ich nicht, denn \d sollte nur Ziffern finden und ^ von Anfang, $ vom Ende.

Ist mein Problem jetzt deutlicher geworden?

peilung



Nö.

Denn was soll am Ende aus der Regexp() werden?
Beispiel:
Diese hier
$regexp(%track%,(\d+)/(\d+),$2 $1)
tauscht TRACK mit TOTAL aus 3/14 wird 14 3
Aber wozu?

Die fortlaufende Tracknummer entspricht zugleich der Platzierung in einer Chartliste, die Gesamtzahl der relevanten Gruppe (Top10, Top20 usw.). Diese Angaben werden in anderen Aktionen weiterverarbeitet (Dateien verschieben, Gruppen bilden...).

Und ich versuche dabei die Regex zu verstehen :angry: Mir ist absolut unklar, warum der Ausdruck

^\d*

nicht von vorne an die Angabe im Trackfeld '14/100' durchsucht und am Schrägstrich aufhört.

Jetzt klarer? :frowning:

peilung

Tja, ich kriege mit \d auch nur alle Zahlen raus.
Aber den vorderen Teil kriegt man aus TRACK doch am leichtesten mit $num raus ...
Und den hinteren Teil kriegst du mit
$regexp(%track%,(\d+)/,)

Ich danke Dir für Deinen Tipp!

Wenn ich die Ergebnisse der Internetseite REGEXR.COM zugrunde legen, nämlich


und


deutet vieles für mich auf eine Anomalie im Regex-Parser von MP3TAG hin. Oder ich habe etwas wirklich nicht verstanden.

peilung



Folgende Beispiele können das Finden und Ersetzen mit einem Regulären Ausdruck vielleicht besser verständlich machen.

$regexp('12/345','(\d)(\d)','$1') ==> '1/35' $regexp('12/345','(\d)(\d)','$2') ==> '2/45' $regexp('12/345','\d\d','x') ==> 'x/x5' $regexp('12/345','(\d)(\d)','$1x') ==> '1x/3x5' $regexp('12/345','(\d)(\d)','$2x') ==> '2x/4x5' $regexp('12/345','^(\d+)','x$1x') ==> 'x12x/345' $regexp('12/345','(\d+)$','x$1x') ==> '12/x345x' $regexp('12/345','^(\d+).*','x$1x') ==> 'x12x' $regexp('12/345','.*?(\d+)$','x$1x') ==> 'x345x' $regexp('12/345','.*?(\d+)','x$1x') ==> 'x12xx345x' $regexp('12/345','.*(\d+).*','x$1x') ==> 'x5x' $regexp('12/345','.*?(\d+).*','x$1x') ==> 'x12x' $regexp('12/345','.*?(\d+).*?','x$1x') ==> 'x12xx345x' $regexp('12/345','^(\d+).*$','$1') ==> '12' $regexp('12/345','.*?(\d+)$','$1') ==> '345' $regexp('12/345','^(\d+)\D(\d+)$','$1') ==> '12' $regexp('12/345','^(\d+)\D(\d+)$','$2') ==> '345'

DD.20160209.1240.CET