2015-05-19 6 views
6

क्वेरी को टोकन करने के लिए एक जावास्क्रिप्ट नियमित अभिव्यक्ति हाय मैं नियमित अभिव्यक्तियों से संबंधित किसी समस्या पर ठोकर खा रहा हूं जिसे मैं हल नहीं कर सकता।क्वेरी

मैं क्वेरी (भागों में विभाजित क्वेरी), निम्न में से एक उदाहरण के रूप में लगता है tokenize की जरूरत है:

These are the separate query elements "These are compound composite terms" 

मैं अंत में की जरूरत है 7 टोकन की एक सरणी के लिए है:

1) These 
2) are 
3) the 
4) separate 
5) query 
6) elements 
7) These are compound composite term 

सातवें टोकन में कई शब्द होते हैं क्योंकि यह दोहरे उद्धरण चिह्नों के अंदर था।

मेरा प्रश्न है: क्या का उपयोग करके उपर्युक्त स्पष्टीकरण के अनुसार इनपुट स्ट्रिंग को टोकन करना संभव है?

संपादित

मैं Regex.exec या इसी तरह के कोड के बजाय split का उपयोग करते समय एक ही बात को प्राप्त करने की संभावना के बारे में उत्सुक था, इसलिए मैं कुछ जांच कि another question here के बाद किया गया किया गया है। और इसलिए एक प्रश्न के एक और जवाब के रूप में एक निम्नलिखित regex इस्तेमाल किया जा सकता:

(?:")(?:\w+\W*)+(?:")|\w+ 
के बाद एक-लाइनर उपयोग परिदृश्य के साथ

:

var tokens = query.match(/(?:")(?:\w+\W*)+(?:")|\w+/g); 

आशा है कि यह उपयोगी होगा ...

उत्तर

5

आप इस regex का उपयोग कर सकते हैं: अगर उन एक अग्रदर्शी का उपयोग कर सुनिश्चित करें कि अंतरिक्ष के बाद भी उद्धरण की संख्या देखते हैं बनाने के लिए द्वारा बाहर डबल कोट्स हैं

var s = 'These are the separate query elements "These are compound composite term"'; 

var arr = s.split(/(?=(?:(?:[^"]*"){2})*[^"]*$)\s+/g); 
//=> ["These", "are", "the", "separate", "query", "elements", ""These are compound composite term""] 

इस regex रिक्त स्थान पर विभाजित कर देगा।

+1

ओह, मैं बजाय स्ट्रिंग ... – Lu4

+0

बंटवारे के मूल्यों क्वेरी करने के लिए कोशिश कर रहा था लेकिन इस मामले में, आप के आसपास '" ये यौगिक समग्र अवधि हैं "' दोहरे उद्धरण चिह्न है। मैंने सोचा कि आपको कोई उद्धरण नहीं चाहिए। –

+1

यह भी काम करेगा, मुख्य बिंदु प्रदर्शन – Lu4

2

आप स्ट्रिंग विभाजित है और दोहरे उद्धरण चिह्नों में सबस्ट्रिंग हड़पने के लिए, और फिर एक सरल तरीका उपयोग कर सकते हैं clean समारोह के साथ खाली सरणी आइटम से छुटकारा पाने:

Array.prototype.clean = function() { 
 
    for (var i = 0; i < this.length; i++) { 
 
    if (this[i] == undefined || this[i] == '') {   
 
     this.splice(i, 1); 
 
     i--; 
 
    } 
 
    } 
 
    return this; 
 
}; 
 

 
var re = /"(.*?)"|\s/g; 
 
var str = 'These are the separate query elements "These are compound composite term"'; 
 
var arr = str.split(re); 
 
alert(arr.clean());

2

आप कर सकते हैं एक उद्धरण और अगले ".*?" या व्हाइटस्पेस \S+:

के बीच की हर चीज प्राप्त करें

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