मैं एक संगीत तार की स्ट्रिंग प्रस्तुति को पार्स करने के लिए एक फ़ंक्शन लिखने की कोशिश कर रहा हूं।संगीत मिलान करने के लिए Regex Chord
उदाहरण: सी सरगम ->Cmaj (यह क्या मैं पार्स करने के लिए करना चाहते हैं)
बस इसे स्पष्ट करना, एक तार तीन अलग-अलग हिस्सों से बना है:
- टिप्पणी (सी, डी, ई, एफ, जी, ए)
- कि नोट के लिए accidentals (#, ##, बी, बी बी)
- तार नाम
उन लोगों के लिए, संगीत समझदार, मैं स्लैश chords (उद्देश्य पर) पर विचार नहीं कर रहा हूँ।
नीचे दिया गया कार्य लगभग काम कर रहा है। हालांकि यह अभी भी निम्न मामले के लिए काम नहीं करता:
- "सी # मेजर" # मैच और चाहिए
- "सी # maj7" # मैच और चाहिए
- "सी # maj2" # mathches और नहीं
मुझे लगता है कि अगर मैं chords
regex हिस्सा regex के अंत में होना करने के लिए मजबूर कर सकता है, चाल किया था। मैंने इस स्ट्रिंग के पहले और बाद में $
का उपयोग करने का प्रयास किया है लेकिन यह काम नहीं करता है।
कोई विचार? धन्यवाद।
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!");
}
}
पैटर्न 'सी # maj2' और' सी # maj7' के बीच समान (सी # maj \ d) है, इसलिए उनके बीच अंतर भिन्नता वास्तव में regex के लिए एक नौकरी नहीं है। मैं उस पैटर्न के सभी उदाहरणों को पकड़ूंगा और फिर सत्यापित करने के लिए कुछ और स्ट्रिंग पैटर्न का उपयोग करूंगा। हालांकि आप एक रेगेक्स बना सकते हैं जिसमें सभी स्वीकार किए गए अंकों को अक्षर के रूप में शामिल किया गया हो। –
मैं सभी संभावित तारों वाले स्थिर संग्रह बनाएगा। संग्रह में स्ट्रिंग प्रतिनिधित्व पाया जाता है या नहीं। – hovanessyan
"... उन लोगों के लिए, संगीत समझदार, मैं स्लैश chords पर विचार नहीं कर रहा हूं ..." बस रिकॉर्ड के लिए: आप * सबसे * तारों को अनदेखा कर रहे हैं, सिर्फ स्लैश chords नहीं। –