RegExpr für klassiche Beschriftung von Tonart


#1

Ich möchte gerne die klassische Beschriftung der Tonarten in meinen TITLE mit einer RegExpr lösen. Leider scheitere ich an der richtigen Gross-/Kleinschreibung:

Die (relevanten Teile der) Titel heissen z.B.:
B Major
b Major
B major
C Minor
c minor
etc.

und ich möchte schlussendlich überall einheitlich einen grossen einzelnen Buchstaben, einen Bindestrich und einen grossen ersten Buchstaben des folgenden Wortes, also z.B.
B-Major
C-Minor

Bisher hab ich:
Regulärer Ausdruck: ([A-G]\s)(?=(major|minor))
Treffer ersetzen durch: $trim($upper($0))-$caps2($2)

Warum ergibt mir das aber für den zweiten Teil hinter dem Bindestrich ($2) immer eine Verdoppelung des Wortes "Major" oder "Minor"?


#2

Hast du dir das richtig durchdacht?
Siehe: http://en.wikipedia.org/wiki/Category:Musical_keys
Wie willst du z. B. mit solchen Tonarten umgehen:
A♭Dur = A-flat major
c♯Moll = C-sharp minor

DD.20080223.1538.CET


#3

Hmm, sowas ist bei mir bisher nicht vorgekommen :ph34r:

Aber Du hast natürlich recht. Wahrscheinlich hätte ich daraus folgendes gemacht:
Ab-Major
C#-Minor


#4

Nur 'mal so als erster Versuch:

$caps($regexp($lower(%TONART%),^('['a-g']')\s(m(aj|in)or)$,$1-$2),-)

mit %TONART% = 'a miNor'
ergibt es: 'A-Minor'

DD.20080223.1654.CET

... und ein zweiter Versuch:

$caps($regexp($replace($lower(%TONART%),'-flat ','b ','-sharp ','# '),^('['a-g']''['b#']'*)'['\s|-']'(m(aj|in)or)$,$1-$2),-)

oder

$caps($regexp($replace($lower(%TONART%),'-flat ','b ','-sharp ','# '),'^([a-g][b#]*)[\s|-](m(aj|in)or)$',$1-$2),-)

Beispiele:

'a-major' ==> 'A-Major'
'g-minor' ==> 'G-Minor'

'a major' ==> 'A-Major'
'g minor' ==> 'G-Minor'

'ab-minor' ==> 'Ab-Minor'
'a#-major' ==> 'A#-Major'

'ab minor' ==> 'Ab-Minor'
'a# major' ==> 'A#-Major'

'a-FLAT miNor' ==> 'Ab-Minor'
'a-ShArP mAJor' ==> 'A#-Major'

DD.20080223.1711.CET


[X] Regexp range repeat is broken
#5

Danke für Deine Bemühungen!

Ich wende im Moment (bis auf weiteres :sunglasses: ) folgende Syntax an:

Regulärer Ausdruck: (\s[A-G]{1}\s)(?=(major|minor))
Treffer ersetzen durch: $upper($0)

(Ich suche also noch "alleinstehenden" Buchstaben zwischen A und G gefolgt von 'major' oder 'minor'. Die Treffer werden GROSSgeschrieben)

Danach folgen zwei hundskomune
Ersetzen TITLE
1 x mit " minor" -> "-Minor"
1 x mit " major" -> "-Major"

Das funktioniert bisher auch mit C# und Eb-Varianten. Mal sehen, was die weiteren Tests bringen.