9

和音の文字列表現を解析する関数を作成しようとしています。

例: C メジャー コード -> Cmaj (これは解析したいものです)

わかりやすくするために、コードは 3 つの異なる部分で構成されています。

  • 音符 (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!");
    }
}
4

4 に答える 4

2

JavaScriptを許しますが、純粋に正規表現の点では、このパターンは機能しているようです。どのコード名の後にどの番号を許可するかを指定していませんが、2は「sus」の後にのみ許可され、7は「min」と「maj」の後にのみ許可されると仮定しました。

var chords = "C#maj7 C##maj Bbmaj7 Abmin2 Cbmin Dsus";
var valid_chords = chords.match(/\b[CDEFGAB](?:#{1,2}|b{1,2})?(?:maj7?|min7?|sus2?)\b/g);
于 2012-06-27T15:07:21.780 に答える
2

次の行で[](とに変更します。)

String accidentals = "(#|##|b|bb)";
String chords = "(maj7|maj|min7|min|sus2)";

それ以外の場合は、文字クラスを作成しているだけなので、[maj7|maj|min7|min|sus2]単に文字に一致しmます。

エンディングアンカーも追加したいと思います$か?以前にも問題があったようですが、おそらく前述の問題が原因です。


また、(#|##|b|bb)オプション(つまり、?:を使用(#|##|b|bb)?)にしたいですか?

于 2012-06-27T14:59:38.457 に答える