Tôi đang cố gắng viết một hàm để phân tích chuỗi đại diện của hợp âm nhạc.Regex để phù hợp với một âm nhạc hợp âm
Ví dụ: C lớn âm ->Cmaj (đây là những gì tôi muốn phân tích)
Chỉ cần để làm cho nó rõ ràng, một hợp âm được làm bằng ba phần khác nhau:
- các lưu ý (C, D, E, F, G, A)
- các accidentals cho lưu ý rằng (#, ##, b, bb)
- tên hợp âm
Đối với những người, âm nhạc hiểu biết, tôi không xem xét hợp âm chém (trên mục đích).
Chức năng dưới đây gần như hoạt động. Tuy nhiên nó vẫn không hoạt động đối với trường hợp sau đây:
- "C# maj" # trận đấu và nên
- "C# maj7" # trận đấu và nên
- "C# maj2" # mathches và không nên
tôi giả sử rằng nếu tôi có thể làm cho một phần chords
regex buộc phải ở phần cuối của regex, đã làm các trick. Tôi đã thử sử dụng $
cả trước và sau chuỗi này nhưng nó không hoạt động.
Bất kỳ ý tưởng nào? Cảm ơn.
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ác mô hình giữa 'C# maj2' và' C# maj7' giống hệt nhau (C# maj \ d), vì vậy sự khác biệt giữa chúng không thực sự là một công việc cho regex. Tôi sẽ lấy tất cả các trường hợp của mẫu đó và sau đó sử dụng một số mẫu chuỗi khác để xác thực. Tuy nhiên, bạn có thể xây dựng một regex bao gồm tất cả các chữ số được chấp nhận làm chữ. –
Tôi sẽ tạo các bộ sưu tập tĩnh chứa tất cả các hợp âm có thể. Hơn xem nếu đại diện chuỗi được tìm thấy trong Bộ sưu tập. – hovanessyan
"... Đối với những người, âm nhạc hiểu biết, tôi không xem xét hợp âm chém ..." Chỉ cần cho hồ sơ: Bạn đang bỏ qua * hầu hết * hợp âm, không chỉ cắt giảm hợp âm. –