# Nur letzten Klammerausdruck suchen&ersetzen?

**URL:** https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544
**Category:** Allgemein
**Created:** [January 12, 2016, 3:29pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544 "2016-01-12T15:29:42Z")
**Posts on this page:** 13
**Page:** 1

<div class="post-metadata">

### Author: ![peilung](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/p/6bbea6/32.png) [@peilung](https://community.mp3tag.de/u/peilung)
#### Post date: [January 12, 2016, 3:29pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/1 "2016-01-12T15:29:42Z")

</div>

Hallo,

vieles konnte ich bereits durch Forumsbeispiele in mp3tag lösen. Bei dieser Aufgabe komme ich jedoch nicht voran.

Meine zwei TITLE lauten beispielsweise

House Music _(Move Your Body)_ **(Muzzaik Remix)**  
Buzz Me **(Bruno Barudi Remix)**

Nur der letzte Ausdruck in runden Klammern enthält die Mix-Angabe und soll in eckige Klammern gefasst werden, der Inhalt wird dabei übernommen wie vorgegeben, also

House Music _(Move Your Body)_ **[Muzzaik Remix]**  
Buzz Me **[Bruno Barudi Remix]**

Mit diesem regulären Ausdruck

(.\*)$

glaubte ich, von rechts den ersten Treffer einer runden Klammer sicher greifen zu können... Pustekuchen.

Gibt es eine Lösung, die in beiden Fällen greift? Oder benötige ich mehrere reguläre Ausdrücke? Und kann ich ggf. die Umwandlung "runde" in "eckige Klammern" davon abhängig machen, dass bestimmte Begriffe wie "Mix" vorkommen?

Ich steh auf dem Schlauch...

Besten Dank für eure Hilfe!

---

<div class="post-metadata">

### Author: ![peilung](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/p/6bbea6/32.png) [@peilung](https://community.mp3tag.de/u/peilung)
#### Post date: [January 12, 2016, 3:54pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/2 "2016-01-12T15:54:30Z")

</div>

Einen ersten Ansatz habe ich nach einigem Herumprobieren gefunden: Mit

(()([\w\s]\*)())$

greife ich auf [http://regexr.com/](http://regexr.com/) nur den letzten Klammerausdruck... komme nur bislang nicht darüberhinaus ![:angry:](https://community.mp3tag.de/uploads/default/original/1X/ebadaff04ae073d3d1cb3e2f4c6acf132380e5a5.gif ":angry:")

Vorschläge?

---

<div class="post-metadata">

### Author: ![ohrenkino](https://community.mp3tag.de/user_avatar/community.mp3tag.de/ohrenkino/32/4843_2.png) [@ohrenkino](https://community.mp3tag.de/u/ohrenkino)
#### Post date: [January 12, 2016, 4:03pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/3 "2016-01-12T16:03:26Z")

</div>

Probier mal  
such-string: (._) ((._?))$  
Ersetzen-String:$1 [$2]

Sollte für beide Fälle gehen.

---

<div class="post-metadata">

### Author: ![peilung](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/p/6bbea6/32.png) [@peilung](https://community.mp3tag.de/u/peilung)
#### Post date: [January 12, 2016, 4:48pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/4 "2016-01-12T16:48:58Z")

</div>

Danke! Das klappt.

Weil die Leerzeichen vor den Klammern nicht immer eindeutig gesetzt sind, habe ich das Beispiel wie folgt abgewandelt:

Such-String: (._)((._?))$  
Ersetzen-String: $1[$2]

Zwischenzeitlich hatte ich bereits über die "any character except"-Maskierung auch diesen Ausdruck für gültig befunden:

Such-String: (._)(([^(]_))$  
Ersetzen-String: s.o.

Mein Such-String ist etwas länger. Und bei Deinem ist mir nicht klar, welche Bedeutung das hinten angestellte Fragezeichen hat. Laut mp3tag-Hilfe ist ein Wiederholerzeichen "keinmal oder einmal", nur dass der Stern ebenfalls ein Wiederholerzeichen ist... ich würd's gern verstehen.

Und welche Möglichkeiten habe ich, das Ersetzen des letzten Klammer-Ausdrucks davon mitabhängig zu machen, dass bestimmte Signalwörter wie "Mix" vorkommen?

Mein Gefühl sagt mir, dass hier eine "pipe" notwendig wäre... ich kenn mich nur nicht damit aus ![:angry:](https://community.mp3tag.de/uploads/default/original/1X/ebadaff04ae073d3d1cb3e2f4c6acf132380e5a5.gif ":angry:")

Vorschläge?

---

<div class="post-metadata">

### Author: ![FredHermann](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/f/b9bd4f/32.png) [@FredHermann](https://community.mp3tag.de/u/FredHermann)
#### Post date: [January 12, 2016, 4:51pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/5 "2016-01-12T16:51:44Z")

</div>

> [@peilung](#):
>
> ...
> 
> House Music _(Move Your Body)_ **(Muzzaik Remix)**  
> Buzz Me **(Bruno Barudi Remix)**
> 
> ...

Hallo peilung,

ich habe die Remixe, Versions etc. auch immer in eckigen Klammern. Dafür benutze ich folgende Aktion.

Aktionstyp: Ersetzen mit regulären Ausdrücken  
Feld: TITLE  
Regulärer Ausdruck: (([^(]_(?:Acoustic|Bonus|Cut|Dub|Edit|Extended|Instrumental|mix|P(?:ar)?t.?|Version)[^)]_))  
Treffer ersetzen durch: [$1]  
 Groß-/Kleinschreibung berücksichtigen

Hierbei wird nach diversen Stichworten innerhalb runder Klammern gesucht. Die Stichworte werden durch | getrennt.

Vllt. auch ganz interessant für dich:  
Ich hatte mal meine Prozeduren vorgestellt um eine Hilfestellung für Anfänger zu bieten. Aller Anfang ist halt schwer 😉 Dort ist dieses Beispiel auch zu finden.

[Anfängerhilfe zu Skriptbefehlen und Ordnerstruktur](https://community.mp3tag.de/t/14223/1)

Bei Bedarf kann ich meine hochgeladenen Aktionen dort auch aktualisieren.

Mit freundlichen Grüßen

FredHermann

---

<div class="post-metadata">

### Author: ![peilung](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/p/6bbea6/32.png) [@peilung](https://community.mp3tag.de/u/peilung)
#### Post date: [January 12, 2016, 5:23pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/6 "2016-01-12T17:23:45Z")

</div>

Hallo FredHermann,

ich danke Dir für Deine Hinweise. Und ja, die eckigen Klammern sind eine gute Hilfe. Offenbar sind wir auf einer Wellenlänge, was die Tags betrifft (für mich sind die RAK-Musik eine wichtige Orientierung).

Deine Hinweise werde ich mir in Ruhe durchlesen müssen. Ist eine Menge Lesestoff - und das Zusammenspiel einiger RegEx-Zeichen ist mir noch nicht klar.

In jedem Fall auch Dir meinen Dank. Fragen werden wohl folgen...

Viele Grüße,

peilung

---

<div class="post-metadata">

### Author: ![ohrenkino](https://community.mp3tag.de/user_avatar/community.mp3tag.de/ohrenkino/32/4843_2.png) [@ohrenkino](https://community.mp3tag.de/u/ohrenkino)
#### Post date: [January 12, 2016, 6:50pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/7 "2016-01-12T18:50:18Z")

</div>

> [@peilung](#):
>
> ... welche Bedeutung das hinten angestellte Fragezeichen hat. ...

Das Fragezeichen schaltet die "Gierigkeit" des regulären Ausdrucks ab. Damit wird wirklich nur die hintere Klammer genommen und nicht der größtmögliche String zwischen schließender und öffnender Klammer.

---

<div class="post-metadata">

### Author: ![peilung](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/p/6bbea6/32.png) [@peilung](https://community.mp3tag.de/u/peilung)
#### Post date: [January 12, 2016, 7:00pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/8 "2016-01-12T19:00:34Z")

</div>

Ich danke Dir für Deine Ausführunge!

zwar hatte ich davon in der Hilfe gelesen, nur hatte ich es im konkreten Beispiel nicht erkannt. Nun wird's klar.

Gruß & schönen Abend,

peilung

---

<div class="post-metadata">

### Author: ![peilung](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/p/6bbea6/32.png) [@peilung](https://community.mp3tag.de/u/peilung)
#### Post date: [January 13, 2016, 5:15pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/9 "2016-01-13T17:15:06Z")

</div>

> [@FredHermann](#):
>
> Aktionstyp: Ersetzen mit regulären Ausdrücken  
> Feld: TITLE  
> Regulärer Ausdruck: (([^(]_(?:Acoustic|Bonus|Cut|Dub|Edit|Extended|Instrumental|mix|P(?:ar)?t.?|Version)[^)]_))  
> Treffer ersetzen durch: [$1]  
> Groß-/Kleinschreibung berücksichtigen

Hallo FredHermann,

ich habe gerade dies ausprobiert... und es klappt! Ist schon mächtig praktisch, weil es zugleich eine Art Inhaltskontrolle ist.

Besten Dank!

peilung

---

<div class="post-metadata">

### Author: ![peilung](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/p/6bbea6/32.png) [@peilung](https://community.mp3tag.de/u/peilung)
#### Post date: [January 13, 2016, 5:46pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/10 "2016-01-13T17:46:50Z")

</div>

So, das Grundgerüst funktioniert.

Meine nächste Frage ist, ob MP3TAG einen **RegEx-Debugger** hat. Ich finde es ziemlich mühsam, eine Aktion fertig zu machen und danach nur über das "erfolgreich"/"klappt nicht" beurteilen zu können.

Zudem habe ich festgestellt, dass ich die Zusatzkünstler ("Featured Artists") im Title-Tag deponiere. Daher kann ich mit den **[an dieser Stelle](https://community.mp3tag.de/t/14223/1)** vorgestellten Hinweisen meine Frage nicht abschließend lösen.

Konkret:

Kann ich in $strstr auch mit einer Pipe arbeiten, um mehrere Werte zum Vergleich heranzuziehen? In **[diesen Beispielen](https://community.mp3tag.de/t/14223/1)** finde ich **$strstr(%artist%,'feat.')**. Für mich wäre jedoch auch das "&" ein Suchbegriff, hinter dem ein Künstler stehen kann, also sinngemäß **$strstr(%artist%,'feat.'|'&')**.

Wenn ich dann den Teil mit den Zusatzkünstlern gegriffen habe, wie ergänze ich den zu Beginn meines Versionshinweises, innerhalb der eckigen Klammer und mit Satzpunkt vor dem weiteren Klammerinhalt? Dazu besser ein Beispiel:

(vorher)  
ARTIST:Felix Jaehn **feat. Thallie Ann Seenyen**  
TITLE:Dance With Me [Original Mix]

(nachher)  
ARTIST:Felix Jaehn  
TITLE:Dance With Me [**feat. Thallie Ann Seenyen.** Original Mix]

Irgendwie stehe ich mit den String-Manipulatoren noch auf Kriegsfuß ![:angry:](https://community.mp3tag.de/uploads/default/original/1X/ebadaff04ae073d3d1cb3e2f4c6acf132380e5a5.gif ":angry:")

Besten Dank für jede Hilfe.

---

<div class="post-metadata">

### Author: ![ohrenkino](https://community.mp3tag.de/user_avatar/community.mp3tag.de/ohrenkino/32/4843_2.png) [@ohrenkino](https://community.mp3tag.de/u/ohrenkino)
#### Post date: [January 13, 2016, 6:44pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/11 "2016-01-13T18:44:10Z")

</div>

Zu dem Dauerthema "feat" nach sonstwohin verschieben gibt es hier einige Hinweise, tw. auf Englisch, aber die Anweisungen sind zu verstehen:  
[/t/17521/1](https://community.mp3tag.de/t/17521/1)

Du kannst die Funktion Konverter\>Tag-Tag als debugger verwenden, indem du dort den Ausdruck  
$regexp(zu durchsuchender string,suchstring,ergebnisstring) als Formatstring einträgst.

---

<div class="post-metadata">

### Author: ![DetlevD](https://community.mp3tag.de/user_avatar/community.mp3tag.de/detlevd/32/123_2.png) [@DetlevD](https://community.mp3tag.de/u/DetlevD)
#### Post date: [January 13, 2016, 7:23pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/12 "2016-01-13T19:23:39Z")

</div>

> [@peilung](#):
>
> ... wie ...  
> (vorher)  
> ARTIST:Felix Jaehn **feat. Thallie Ann Seenyen**  
> TITLE:Dance With Me [Original Mix]  
> (nachher)  
> ARTIST:Felix Jaehn  
> TITLE:Dance With Me [**feat. Thallie Ann Seenyen.** Original Mix]  
> ...

**Step 1. Action "Guess values" Source format: %TITLE%' '$regexp(%ARTIST%,'^(.+?)\s+[[({]?(?:ft\.?|feat\.?|featuring)\s+([^][(){}]+)[])}]?(\s+.+)?$','(feat. $2$3)===$1',1) Guessing pattern: %TITLE%===%ARTIST% From: ARTIST = 'Felix Jaehn feat. Thallie Ann Seenyen' TITLE = 'Dance With Me [Original Mix]' To: ARTIST = 'Felix Jaehn' TITLE = 'Dance With Me [Original Mix] (feat. Thallie Ann Seenyen)' Step 2. Action "Format value" Field: TITLE Formatstring: $regexp(%TITLE%,'^(.+?)\s+\[(.+?)\]\s+[[({]?(?:ft\.?|feat\.?|featuring)\s+([^][(){}]+)[])}]?$','$1 [feat. $3. $2]',1) ... or ... Formatstring: $regexp(%TITLE%,'^(.+?)\s\[(.+?)\]\s\(feat\.\s(.+?)\)$','$1 [feat. $3. $2]',1) ... or ... Formatstring: $regexp(%TITLE%,'^(.+?)\s\[(.+?)\]\s\((feat\.\s.+?)\)$','$1 [$3. $2]',1) From: TITLE = 'Dance With Me [Original Mix] (feat. Thallie Ann Seenyen)' To: TITLE = 'Dance With Me [feat. Thallie Ann Seenyen. Original Mix]'**

Siehe auch ...  
[Move "Featuring" from Artist to Title](https://community.mp3tag.de/t/11096/28)

DD.20160113.2123.CET

---

<div class="post-metadata">

### Author: ![peilung](https://community.mp3tag.de/letter_avatar_proxy/v4/letter/p/6bbea6/32.png) [@peilung](https://community.mp3tag.de/u/peilung)
#### Post date: [January 14, 2016, 6:55pm UTC](https://community.mp3tag.de/t/nur-letzten-klammerausdruck-suchen-ersetzen/17544/13 "2016-01-14T18:55:26Z")

</div>

Mein großes Dankeschön an euch, ohrenkino, FredHermann und DetlevD! Ich hätte es zunächst nicht geglaubt - und doch wurde meine Frage vollständig beantwortet... mit hohem Lerneffekt für mich.

> [@ohrenkino](#):
>
> Du kannst die Funktion Konverter\>Tag-Tag als debugger verwenden, indem du dort den Ausdruck  
> $regexp(zu durchsuchender string,suchstring,ergebnisstring) als Formatstring einträgst.

Dieser Tipp ist superpraktisch und hat mir für die weitere Arbeit vieles erleichtert.

> [@FredHermann](#):
>
> Vllt. auch ganz interessant für dich:  
> Ich hatte mal meine Prozeduren vorgestellt um eine Hilfestellung für Anfänger zu bieten. Aller Anfang ist halt schwer 😉 Dort ist dieses Beispiel auch zu finden.

Ja, anhand der Beispiele habe ich einiges verstanden, auch wenn mir noch eine Einstiegshilfe fehlte.

> [@DetlevD](#):
>
> Siehe auch ...  
> [Move "Featuring" from Artist to Title](https://community.mp3tag.de/t/11096/28)

Dank dieser Einstiegshilfe sowie den passend geposteten Beispielen konnte ich dann durch geringfügige Anpassungen folgendes Aktionsset anlegen:

_Name der Aktionengruppe:_ **Extra-Künstler von ARTIST zu TITLE (feat. und &-with)**

Aktion #1:  
_Aktionstyp:_ **Ersetzen mit regulären Ausdrücken**  
_Feld:_ **TITLE**  
_Regulärer Ausdruck:_ **(([^(]_(?:Acoustic|Bonus|Cut|Dub|Edit|Extended|Instrumental|Live|mix|Skit|Unplugged|Versi  
on)[^)]_))**  
_Treffer ersetzen durch:_ **[$1]**

[] Groß-/Kleinschreibung berücksichtigen

Aktion #2:  
_Aktionstyp:_ **Tag-Felder importieren**  
_Quellformat:_ **%TITLE%' '$regexp(%ARTIST%,'^(.+?)\s+[[({]?&\s+([^][(){}]+))}]?(\s+.+)?$','(with $2$3)===$1',1)**  
_Formatstring:_ **%TITLE%===%ARTIST%**

Aktion #3:  
_Aktionstyp:_ **Tag-Felder formatieren**  
_Feld:_ **TITLE**  
_Formatstring:_ **$regexp(%TITLE%,'^(.+?)\s[(.+?)]\s((with\s.+?))$','$1 [$3. $2]',1)**

Aktion #4:  
_Aktionstyp:_ **Tag-Felder importieren**  
_Quellformat:_ **%TITLE%' '$regexp(%ARTIST%,'^(.+?)\s+[[({]?(?:ft.?|feat.?|featuring)\s+([^][(){}]+))}]?(\s+.+)?$','(feat. $2$3)===$1',1)**  
_Formatstring:_ **%TITLE%===%ARTIST%**

Aktion #5:  
_Aktionstyp:_ **Tag-Felder formatieren**  
_Feld:_ **TITLE**  
_Formatstring:_ **$regexp(%TITLE%,'^(.+?)\s[(.+?)]\s((feat.\s.+?))$','$1 [$3. $2]',1)**

Zwei Dinge sind hervorzuheben. Erstens sind bei mir auch die Ausführungsformen "Live", "Unplugged" und "Skit" als relevantes Muster enthalten. Und zweitens sind bei mir auch Gruppenpartner, die mit dem Firmenund "&" angeführt sind, Extrakünstler. Das führt jedoch teilweise zu blöden Ergebnissen, die ich von Hand nachbessern muss... nämlich, wenn Gruppen sinngemäß "Salt & Pepper" oder "Jam & Spoon" heißen. Dieses muss ich von Hand dann zurückbessern, was in Summe jedoch weniger aufwändig ist, als alle "&"-Erweiterungen rüberzuheben.

Alles habe ich noch nicht verstanden, doch das wird durch weitere Umsetzung (hoffentlich) noch kommen.

Also lieben dank an alle & bis zur nächsten Frage ![:rolleyes:](https://community.mp3tag.de/uploads/default/original/1X/3a79e8b0b7d169b30216785521d7c6f4f895c421.gif ":rolleyes:")

peilung
