मैं कुछ बुनियादी जावास्क्रिप्ट regex सीखने की कोशिश कर रहा हूँ। शुरुआत के रूप में, मैं प्रलेखन पढ़ा और यह SO सवाल: आप जावास्क्रिप्ट नियमित अभिव्यक्ति में मिलान किए गए समूहों तक कैसे पहुंचते हैं?
मुझे लगता है कि मैंने अभिव्यक्ति के अधिकांश को समझ लिया है:
/(?:^|s)format_(.*?)(?:s|$)/g
इस भाग को छोड़कर:
(.*?)
मुझे पता है कि
.*
किसी भी चरित्र के 0 या अधिक घटनाओं से मेल खाना है (न्यूलाइन या लाइन टर्मिनेटर को छोड़कर)।
लेकिन मैं यह नहीं समझ सकता कि क्यों
?
जरूरत है।
मैं कुछ इसी तरह से खेल रहा था:
/(?:^|s)ab(.*?)ab(?:s|$)/
" ab4545ab "
और चीजें उसके साथ या उसके बिना व्यवहार कर रही हैं
?
में
(.*?)
कोई विचार?
धन्यवाद!
उत्तर:
जवाब के लिए 5 № 1यह बनाता है .*
गैर लालची। इसका मतलब है कि रेगेक्स में अगले वैध वर्ण अनुक्रम की पहली घटना रोक दी जाएगी .*
.
के बिना ?
, द .*
रेगेक्स में अगले वैध वर्ण अनुक्रम की अंतिम घटना तक उपभोग करेगा।
var s = "foo bar boo bar foo";
var greedy = /.*bar/;
var no_greed = /.*?bar/;
greedy.exec(s); // foo bar boo bar
no_greed.exec(s); // foo bar
तो लालची आखिरी "बार" में पहली बार "बार" से पहले खपत करता है।
गैर लालची केवल पहले "बार" में जाती है।
जवाब के लिए 4 № 2
The ?
बाद एक .+
या .*
मैच को बनाना होगा मैच आलसी डिफ़ॉल्ट के बजाय लालची. मतलब, यह संभव के रूप में कुछ अक्षर के रूप में मैच होगा, इसके विपरीत में के रूप में कई ।
उदाहरण:
"hello".match(/.+/) //Returns ["hello"]
"hello".match(/.+?/) //Returns ["h"]
जवाब के लिए 2 № 3
The ?
quantifier को लालची बना देता है । इसके बिना *
संभव के रूप में कई पात्रों के रूप में खा जाएगा, जो विशेष रूप से शक्तिशाली है .
. हालांकि, ?
वहां के रूप में आवश्यक के रूप में कुछ खा जाएगा ।
उदाहरण के लिए, यह स्ट्रिंग लें: "abcccbacba"
, और यह मैच के खिलाफ /abc(.*)ba/
. यह होगा कब्जा करने में परिणाम ccbac
. दूसरी ओर /abc(.*?)ba/
कब्जा करेंगे cc
.