我正在尝试编写一个函数来解析音乐和弦的字符串表示。
示例:C 大调和弦 -> Cmaj(这是我要解析的)
为了清楚起见,和弦由三个不同的部分组成:
- 音符(C、D、E、F、G、A)
- 该音符的临时记号(#、##、b、bb)
- 和弦名称
对于那些精通音乐的人,我不考虑斜线和弦(故意)。
以下功能几乎可以正常工作。但是它仍然不适用于以下情况:
- "C#maj" # 匹配并且应该
- "C#maj7" # 匹配并且应该
- "C#maj2" #数学运算,不应该
我想如果我可以让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!");
}
}