Regex zum Abgleichen eines Musik-Chords

8

Ich versuche eine Funktion zu schreiben, um die String-Darstellung eines musikalischen Akkords zu analysieren.

Beispiel: C-Dur-Akkord - & gt; Cmaj (das möchte ich analysieren)

Nur um es klar zu machen, besteht ein Akkord aus drei verschiedenen Teilen:

  • die Notiz (C, D, E, F, G, A)
  • die Vorzeichen für diese Note (#, ##, b, bb)
  • der Name des Akkords

Für diejenigen, die Musik beherrschen, denke ich nicht an Schrägstriche (absichtlich).

Die folgende Funktion funktioniert fast. Es funktioniert jedoch immer noch nicht für den folgenden Fall:

  • "C # maj" # stimmt überein und sollte
  • "C # maj7" # passt und sollte
  • "C # maj2" # mathes und sollte nicht

Ich nehme an, dass, wenn ich den chords regex Teil gezwungen hätte, am Ende der Regex zu sein, den Trick gemacht hätte. Ich habe versucht, die $ vor und nach diesem String, aber es hat nicht funktioniert.

Irgendeine Idee? Danke.

%Vor%     
nunos 27.06.2012, 14:54
quelle

3 Antworten

2

Ändern Sie [ und ] in ( und ) in den folgenden Zeilen:

%Vor%

Ansonsten machst du nur Charakterklassen, also passt [maj7|maj|min7|min|sus2] einfach auf den Buchstaben m .

Ich nehme an, Sie möchten auch einen Endanker $ hinzufügen? Ich sehe, dass du vorher Probleme damit hattetest, aber das liegt wahrscheinlich an dem oben erwähnten Problem.

Vielleicht möchten Sie auch, dass (#|##|b|bb) optional ist (d. h. mit ? : (#|##|b|bb)? )?

    
Wiseguy 27.06.2012, 14:59
quelle
2

Verzeiht das JavaScript, aber an einem reinen REGEX-Punkt scheint dieses Muster zu funktionieren. Du hast nicht festgelegt, welche Nummern nach welchen Akkordnamen erlaubt sind, aber ich habe angenommen, dass 2 nur nach 'sus' und 7 erst nach 'min' und 'maj' erlaubt ist.

%Vor%     
Utkanos 27.06.2012 15:07
quelle
0

Aufbauend auf Wiseguys Antwort habe ich Ihren Regex-Abgleich verbessert. Ich musste # außerhalb der Variablen accidentals hinzufügen, da \b passend zu # auswirft.

Bonus : Es passt sogar Akkorde wie Dsus9, D7 etc.

Verzeiht das JavaScript, aber das ist der Code, den ich benutzt habe:

%Vor%
    
Amit 02.10.2017 08:57
quelle

Tags und Links