Я пытаюсь написать функцию для синтаксического анализа строкового представления музыкального аккорда.Regex для соответствия музыке Chord
Пример: C мажорный аккорд ->CMAJ (это то, что я хочу, чтобы разобрать)
Просто чтобы понять, аккорд состоит из трех различных частей:
- ПРИМЕЧАНИЯ (С, D, Е, F, G, а)
- в случайности для этой записки (#, ##, б, бб)
- название аккорда
Для тех, кто подружился с музыкой, я не рассматриваю аккорды слэш (специально).
Нижняя функция почти работает. Однако он по-прежнему не работает в следующих случаях:
- "C#" # Maj матчи и должны
- "C#" # maj7 матчи и должны
- "C# maj2" # mathches и не должны
Я полагаю, что если бы я мог сделать chords
регулярок часть вынуждена быть в конце регулярного выражения, сделал трюк. Я попытался использовать $
как до, так и после этой строки, но это не сработало.
Любая идея? Благодарю.
public static void regex(String chord) {
String notes = "^[CDEFGAB]";
String accidentals = "[#|##|b|bb]";
String chords = "[maj7|maj|min7|min|sus2]";
String regex = notes + accidentals + chords;
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(chord);
System.out.println("regex is " + regex);
if (matcher.find()) {
int i = matcher.start();
int j = matcher.end();
System.out.println("i:" + i + " j:" + j);
}
else {
System.out.println("no match!");
}
}
Узор между 'C# maj2' и' C# maj7' одинаково (C# maj \ d), поэтому дифференцирование между ними на самом деле не является заданием для регулярного выражения. Я бы захватил все экземпляры этого шаблона, а затем использовал несколько шаблонов строк для проверки. Однако вы можете создать регулярное выражение, которое включает все принятые цифры в виде литералов. –
Я бы сделал статические коллекции, содержащие все возможные аккорды. Посмотрите, найдено ли строковое представление в Коллекциях. – hovanessyan
«... Для тех, музыкальных подкованных, я не рассматриваю слэш-аккорды ...» Только для записи: вы игнорируете * most * аккорды, а не только косые аккорды. –