2015-10-05 4 views
5

के अंत के खिलाफ की मशीन नहीं मैं निम्नलिखित नियमित अभिव्यक्ति के साथ एक समस्या है:

var s = "http://www.google.com/dir/file\r\nhello" 
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)$"); 
var arr = re.exec(s); 
alert(arr[2]); 

ऊपर, मैं आगमन [2] (यानी कब्जा समूह 2) "फाइल" होने की उम्मीद, लालची लगाने के बाद पहली पंक्ति में अंतिम 4 वर्ण के विरुद्ध मिलान करना। *, पैटर्न के कारण/पीछे बैकट्रैकिंग, और उसके बाद लाइन के अंत के खिलाफ एंकरिंग।

वास्तव में, arr [] शून्य है, जिसका अर्थ है कि पैटर्न भी मेल नहीं खाता था।

मैं इस थोड़ा बदल सकते हैं तो यह ठीक करता है कि मैं क्या करना चाहते हैं:

var s = "http://www.google.com/dir/file\r\nhello" 
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)[\r\n]*"); 
var arr = re.exec(s); 
alert(arr[2]); // "file", as expected 

मेरा प्रश्न तो कैसे रों में पहली पंक्ति के अंत से "फाइल" हड़पने के लिए कितना नहीं है। इसके बजाय, मैं समझने की कोशिश कर रहा हूं कि पहला regexp क्यों विफल रहता है और दूसरा सफल होता है। उदाहरण 1 में \ r \ n लाइन ब्रेक के खिलाफ $ क्यों नहीं मेल खाता है? नहीं है जो इसके अस्तित्व का एकमात्र उद्देश्य है? क्या मुझे कुछ और याद आ रहा है?

$ echo -e "http://www.google.com/dir/file\r\nhello" |sed -r -e 's#http://([^/]+).*/([^/\r\n]+)$#\2.OUTSIDE.OF.CAPTURE.GROUP#' 
<<OUTPUT>> 
file.OUTSIDE.OF.CAPTURE.GROUP 
hello 

यहाँ, कैप्चर समूह 2 कैप्चर "फाइल" और कुछ नहीं: के रूप में ( विस्तारित नियमित अभिव्यक्ति मोड -r के साथ सक्षम के साथ) sed में इस्तेमाल

इसके अलावा, एक ही पहले नियमित अभिव्यक्ति पर विचार करें। आउटपुट में "हैलो" दिखाई देता है, लेकिन कैप्चर समूह के अंदर मौजूद नहीं है, जो आउटपुट में स्ट्रिंग ".OUTSIDE.OF.CAPTURE.GROUP" की स्थिति से साबित होता है। तो नियमित अभिव्यक्ति sed में मेरी समझ के अनुसार काम करती है, लेकिन जावास्क्रिप्ट regexp इंजन में निर्मित नहीं है।

यदि मैं इनपुट स्ट्रिंग में \ r \ n को \ n \ n के साथ प्रतिस्थापित करता हूं, तो व्यवहार सभी तीनों उदाहरणों के लिए समान है, इसलिए जहां तक ​​मैं कह सकता हूं, प्रासंगिक नहीं होना चाहिए। https: // regex101

+0

आप से बचने के लिए भूल जाते हैं '/' यह यहाँ देखने से मेल करने के लिए regex बहु मोड सक्षम करने की आवश्यकता .com/r/cV1nJ0/1 –

+1

जॉर्ज: मुझे डर है कि यह नहीं है। जैसा कि आप अपने लिंक में देख सकते हैं, जो दूसरे कैप्चर समूह के लिए "फ़ाइल \ r \ nhello" कैप्चर करता है, जबकि मैं बस "फ़ाइल" को कैप्चर करने की कोशिश कर रहा हूं।/Regexp ("...") में उपयोग किए जाने पर एक डिलीमीटर नहीं माना जाना चाहिए, जहां तक ​​मैं कह सकता हूं, न ही sed script में, जहां # delimiter है। वैसे भी धन्यवाद। – jrsanderson

उत्तर