2012-11-06 14 views
10

यदि मेरे पास नियमित रूप से अभिव्यक्ति थी, तो 13 कैप्चरिंग समूह कहें, मैं एक प्रतिस्थापन स्ट्रिंग को कैसे निर्दिष्ट करूं जिसमें शाब्दिक '3' के बाद पहली बैकरेफर शामिल है?जावास्क्रिप्ट बैकरेफर के बाद संख्या

var regex = /(one)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)/; 
"one2345678910111213".replace(regex,"$13"); 
//Returns "13". How do I return "one3"? 

निकटतम सवाल मैं मिल सकता है this one था, लेकिन यह पर्ल के लिए और एक हार्डकोडेड शाब्दिक शामिल नहीं किया था से संबंधित है।

एमडीएन पर docs पर भी एक नज़र डालें, लेकिन उदाहरणों में स्पष्ट रूप से वर्णित या प्रदर्शित नहीं किया गया था।

उत्तर

12

अच्छी पकड़! एकमात्र समाधान मैं के साथ आने कर लिया है:

var regex = /(one)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)/; 
"one2345678910111213".replace(regex, function(match, $1) { return $1 + "3"; }); 

संपादित मैं ECMAScript spec देखा और ऐसा लगता है कि यह एक कॉलबैक के बिना संभव है। कुछ RegExp प्रतिस्थापन इंजन - उदाहरण के लिए, पायथन, \g निर्माण ("समूह" के लिए) है, जहां आप प्रतिस्थापन स्ट्रिंग में \g{1}3 जैसे कुछ का उपयोग कर सकते हैं; लेकिन जावास्क्रिप्ट बस $nn का उपयोग करता है। यही कारण है, अगर आप 9 से अधिक पर कब्जा समूहों मिल गया है, तो आप अस्पष्टता दूर करने के लिए है, इसलिए की तरह एक दो अंकों वापस संदर्भ का उपयोग कर सकते हैं:

"one2345678910111213".replace(regex, "$013"); 
+0

+1, लेकिन है कि अभी भी एक कॉलबैक है। क्या इसका मतलब यह है कि स्ट्रिंग तर्क के साथ ऐसा करना असंभव है? –

+0

ईमानदारी से, मुझे नहीं पता कि कॉलबैक का उपयोग किये बिना इसे कैसे किया जाए: मैंने विभिन्न चीजों की कोशिश की, लेकिन यह एकमात्र ऐसा काम था जो काम करता था। शायद यह एक साधारण स्ट्रिंग के साथ संभव नहीं है। – Xophmeister

+2

... यह संभव है :) संपादित देखें! – Xophmeister

5

बस भविष्य में संदर्भ के लिए एक संक्षिप्त जवाब जोड़ने के लिए:

Backreferences सबसे दो अंक में है, इसलिए "1" के बजाय, backreference # 1 एक शाब्दिक अंक के बाद का उपयोग करने के लिए कॉल यह "01":

"one2345678910111213".replace(regex,"$013"); 
संबंधित मुद्दे