Advanced Regex Request (move "(Feat. variable)" to end of title)

Dear Regex gurus...

I have reached the limit of my regex knowledge, and cannot figure this problem out.

I have titles such as:

Song Title (Feat. Guest Artist) (Deejay Mix)
Song Title 2 (Remix version)
Song Title 3 (Feat. Backup Singer)
Song Title 4 (Mega Dub) (Feat. Someone)

I'm looking for a regex set that would be able to grab the Featured Artist info (except for the parens) and isolate it in a temporary field so that I could append it to the end of the Track Artist field.

I started with FORMAT VALUE "TEMP1": %TITLE% and FORMAT VALUE "TEMP2": %TITLE%, then Regex TEMP1: ^(.+)((.+))$ -> $1 and

Regex TEMP2: ^(.+)\((.+)\)$ -> $2 (and putting TEMP2 after ARTIST and TEMP1 back into TITLE)

but this doesn't check to see if the TEMP2 actually contains "Feat."

The other thing I've been working with is ([Ff]eat[^)]+), but I don't know how to capture this group so that it could go into another field... and it leaves "()" behind since it ignores the opening and closing parentheses.

Any ideas?

I dunno:
Perhaps the regexp approach is not right.
Have you tried "Import Tag field (Guess values)"?
Song Title 3 (Feat. Backup Singer)
would look like this:
%title% (Feat. %featartist%)

Or if you copy all of the title data into FEATARTIST (as a temporary field) and then apply the "Guess values" action, it would be:
%dummy% (Feat. %featartist%)

For tracks like
Song Title (Feat. Guest Artist) (Deejay Mix)
I would prefer the copy-first-approach and then use:
%dummy% (Feat. %featartist%) (%dummy%)

Finally you replace all (feat. .*) with nothing in TITLE.
And then you add the %featartist% to TITLE with format value.

Move FEAT from TITLE to ARTIST and such alike ...
Video Edit Radio Version in Klammern löschen
" (feat.) " problem


DD... that was amazing! I specifically used the first one you noted in thread 17973, copied here for posterity and reference:

Formatstring: %ARTIST%' feat. '$regexp(%TITLE%,'^(.+?)\s+[[({<]?(?:ft.?|feat.?|featuring)\s+(.+?)[])}>]?\s*((.+?))\s*$','$2',1)
"Titel (Ft. Artist 2) (Sososo Remix)" -> "Artist 1 feat. Artist 2"
"Titel Ft. Artist 2 (Sososo Remix)" -> "Artist 1 feat. Artist 2"

Formatstring: $regexp(%TITLE%,'^(.+?)\s+[[({<]?(?:ft.?|feat.?|featuring)\s+(.+?)[])}>]?\s*((.+?))\s*$','$1 $3',1)
"Titel (ft. Artist 2) (Sososo Remix)" -> "Titel (Sososo Remix)"
"Titel ft. Artist 2 (Sososo Remix)" -> "Titel (Sososo Remix)"

I hadn't looked through the .de forums, since I learned French and Spanish in school....

Tausand Dank!

Ok, one new issue.

I'm trying to automatically implement the filter that you mentioned in the previous thread:

Filter: "%TITLE%" MATCHES "^.+? \(?ft.+?\)? \(.+?\)$"

using an $if function.

My current attempt for the filter and the format string is:

$if(%TITLE%" MATCHES "^.+?\((?:[Ff]t.+?|[Ff]eat.+?|[Ff]eaturing.+?)\)\s*\(.+?\)$,%ARTIST%' feat. '$regexp(%TITLE%,'^(.+?)\s+[[({<]?(?:ft\.?|feat\.?|featuring)\s+(.+?)[])}>]?\s*(\(.+?\))\s*$','$2',1),%ARTIST%)

I've tested my MATCH function (^ to $) in an online regex tester (, and it appears to work properly.

Test case Titles are:

More of You (Feat. Rasul) (Soulmagic Classic Remix)
The Touch (Vocal Mix)
Born Free
Dreaming (Feat. Mr. Bailey)

When I test the MATCH function, only the first title highlights.
When I try to run the whole $if function in MP3Tag, though, it would give me this sort of output.

Alfred Azzetto feat. Rasul~~~~~More of You (Soulmagic Classic Remix)
J Nitti feat. The Touch (Vocal Mix)~~~~~The Touch (Vocal Mix)
Jay Vegas feat. Born Free~~~~~Born Free
Sandy Turnbull feat. Dreaming (Feat. Mr. Bailey)~~~~~Dreaming (Feat. Mr. Bailey)

Is there an implementation error that I'm not catching?


The "Mp3tag Filter [F3]" is a feature of the Mp3tag listview, which allows to filter the listview.
The "Mp3tag Filter [F3]" has its own scripting language and operators, see manual.

The Mp3tag scripting language for Actions is different.
Do not apply both scripting languages into one format string for Actions.

If a regular expression in function $regexp() does not match, then the function returns the unchanged input string.

To simulate a 'does not match' filter ...
... or ...
To simulate a 'does match' filter ...

DD.20141001.1031.CEST, DD.20150304.1351.CET