2012-06-27 16 views
8

मैं एक संगीत तार की स्ट्रिंग प्रस्तुति को पार्स करने के लिए एक फ़ंक्शन लिखने की कोशिश कर रहा हूं।संगीत मिलान करने के लिए 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!"); 
    } 
} 
+0

पैटर्न 'सी # maj2' और' सी # maj7' के बीच समान (सी # maj \ d) है, इसलिए उनके बीच अंतर भिन्नता वास्तव में regex के लिए एक नौकरी नहीं है। मैं उस पैटर्न के सभी उदाहरणों को पकड़ूंगा और फिर सत्यापित करने के लिए कुछ और स्ट्रिंग पैटर्न का उपयोग करूंगा। हालांकि आप एक रेगेक्स बना सकते हैं जिसमें सभी स्वीकार किए गए अंकों को अक्षर के रूप में शामिल किया गया हो। –

+0

मैं सभी संभावित तारों वाले स्थिर संग्रह बनाएगा। संग्रह में स्ट्रिंग प्रतिनिधित्व पाया जाता है या नहीं। – hovanessyan

+0

"... उन लोगों के लिए, संगीत समझदार, मैं स्लैश chords पर विचार नहीं कर रहा हूं ..." बस रिकॉर्ड के लिए: आप * सबसे * तारों को अनदेखा कर रहे हैं, सिर्फ स्लैश chords नहीं। –

उत्तर

2

बदलें [ और ] निम्नलिखित लाइनों में ( करने और ):

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

अन्यथा आप केवल कर रहे हैं चरित्र वर्गों, इसलिए [maj7|maj|min7|min|sus2] बस पत्र m पर मेल खाता है।

मुझे लगता है कि आप एक एंडिंग एंकर $ जोड़ना चाहते हैं? मुझे लगता है कि आपको इससे पहले समस्याएं थीं, लेकिन शायद यह उपर्युक्त मुद्दे की वजह से है।


इसके अलावा, आप (#|##|b|bb) वैकल्पिक (: (#|##|b|bb)? अर्थात, ? साथ) होने के लिए चाहते हो सकता है?

2

जावास्क्रिप्ट को क्षमा करें, लेकिन पूरी तरह से REGEX बिंदु पर, यह पैटर्न काम करता प्रतीत होता है। आपने यह निर्धारित नहीं किया कि किस संख्या के बाद तारों के नाम दिए गए हैं, लेकिन मुझे लगता है कि 2 'केवल' के बाद अनुमति दी गई है और 7 'केवल' मिनट और 'माज' के बाद ही अनुमति है।

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); 
+1

यह रेगेक्स अच्छी तरह से काम करता है – grimmdude

0

Wiseguy के उत्तर पर बिल्डिंग, मैंने आपके रेगेक्स मिलान में सुधार किया। # से मिलान करने के बाद से accidentals के बाहर # को जोड़ना पड़ा।

बोनस: यह भी Dsus9, D7 आदि जैसे chords से मेल खाता है

जावास्क्रिप्ट माफ कर दो, लेकिन इस कोड का उपयोग कर रहा समाप्त हो गया है:

var notes = "[CDEFGAB]", 
 
    accidentals = "(b|bb)?", 
 
    chords = "(m|maj7|maj|min7|min|sus)?", 
 
    suspends = "(1|2|3|4|5|6|7|8|9)?", 
 
    sharp = "(#)?", 
 
    regex = new RegExp("\\b" + notes + accidentals + chords + suspends + "\\b" + sharp, "g"); 
 

 
var matched_chords = "A# is a chord, Bb is a chord. But H isn't".match(regex); 
 

 
console.log(matched_chords);

संबंधित मुद्दे