2012-06-27 39 views
3

这是此问题的后续问题:Regex for matching a music Chord,由我问了。音乐和弦部分拆分正则表达式

现在,我有一个正则表达式你知道一个和弦的String表示是否有效(前面的问题),我怎样才能有效地得到和弦的三个不同部分(根音记号和弦类型)变成分开的变量?

我可以做简单的字符串操作,但我想这将是更容易建立在以前的代码,并使用正则表达式,或者我错了?

下面是从上述问题,更新后的代码:

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!"); 
    } 
} 

感谢。

回答

3

将括号括起来(除特殊含义的情况外)会创建一个capturing group或子模式。

您已将accidentalschords分组为子样式,但您需要在notes中添加圆括号以将其捕获为子模式。

String notes = "^([CDEFGAB])"; 
String accidentals = "(#|##|b|bb)?"; 
String chords = "(maj7|maj|min7|min|sus2)"; 

按照惯例,通过将整个图案匹配的字符串是组0,那么每个子模式被捕获作为组1,组2,依此类推。

我不是一个Java的家伙,但阅读它看起来像你访问你的子模式的文档匹配后使用.group()

String note = matcher.group(1); 
String acci = matcher.group(2); 
String chor = matcher.group(3); 

编辑:

原来,我建议String accidentals = "((?:#|##|b|bb)?)";,因为我担心第二个子模式是可选的,如果没有匹配存在,会导致组编号问题。然而,一点测试表明,即使没有将其包装在这样的非捕获分组(?:)中,组2总是存在,但如果没有匹配则为空。 (无论如何,第2组中的空字符串是期望的效果。)因此,看来 ... = "(#|##|b|bb)?";可能毕竟足够了。

+0

+1 - 比我的回答好得多。 –

+0

我猜对了,认为有一个比字符串操作更好的方法。感谢今天第二次 – nunos

2

你已经完成了这项工作。只需添加多一个捕获组,使您最终的正则表达式变成:

^([CDEFGAB])(#|##|b|bb)?(maj7|maj|min7|min|sus2)?$ 

而且你的注意,偶然的,弦将在第一,第二和第三捕获,分别。

2

我喜欢接受的答案,但作为一名吉他手,我会遇到添加了额外低音音符(如G/D,A/D或D/F#)的和弦。当然,您可能会遇到其他一些和弦名称,例如:5,6,min6,9,min9,sus4 ...等等。你可以考虑加入到可能的字符串的和弦数,然后增加一些为低音记号,如果您有任何:

String chords = 
"(maj|maj7|maj9|maj11|maj13|maj9#11|maj13#11|6|add9|maj7b5|maj7#5||min|m7|m9|m11|m13| 
m6|madd9|m6add9|mmaj7|mmaj9|m7b5|m7#5|7|9|11|13|7sus4|7b5|7#5|7b9|7#9|7b5b9|7b5#9| 
7#5b9|9#5|13#11|13b9|11b9|aug|dim|dim7|sus4|sus2|sus2sus4|-5|)"; 
String bass = "/([CDEFGAB])"; 

为了完成“字符串和弦”的定义,你可能想请教chord dictionary 。干杯!