2011-06-11 8 views
15

पर्ल नियमित अभिव्यक्तियों में जावास्क्रिप्ट समकक्ष, आप \Q और \E के साथ एक उप-संपीड़न को घेर सकते हैं ताकि यह इंगित किया जा सके कि आप चाहते हैं कि उप-संपीड़न को शाब्दिक स्ट्रिंग के रूप में मिलान किया जाए, भले ही वहां हों वहाँ metacharacters। आपके पास quotemeta फ़ंक्शन भी है जो एक स्ट्रिंग में बैकस्लैश की सही संख्या को सही ढंग से सम्मिलित करता है ताकि यदि आप बाद में उस स्ट्रिंग को नियमित अभिव्यक्ति में विभाजित कर दें, तो यह सचमुच मेल खाएगा, इससे कोई फर्क नहीं पड़ता कि इसकी सामग्री क्या थी।पर्ल के Q ... E या quotemeta()

क्या जावास्क्रिप्ट (प्रमुख ब्राउज़रों में तैनात के रूप में) समकक्ष में बनाया गया है? मैं अपना खुद का ठीक लिख सकता हूं, लेकिन मुझे यह जानना है कि मुझे परेशान करने की ज़रूरत नहीं है।

उत्तर

14

ऐसी कोई अंतर्निहित सुविधा नहीं है।

अपने आप को लागू करने के बजाय, मैं सलाह देता हूं कि आप इंटरनेट पर उपलब्ध regex escape functions की भीड़ देखें।

कि पेज निम्नलिखित समाधान (Colin Snover द्वारा) का प्रस्ताव:

RegExp.escape = function(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
} 

या XRegExp पुस्तकालय का उपयोग करने की सलाह देता है।

+3

धन्यवाद। लिंक के माध्यम से क्लिक करने वाले किसी भी व्यक्ति को नोट करें: दिनचर्या के * सही * संस्करण के लिए नीचे तक सभी तरह से पढ़ें। – zwol

5

Quotemeta देशी रूप के रूप में जहाँ तक मुझे पता के रूप में लागू नहीं है, लेकिन मैं इस कुछ महीने पहले सिर्फ इस के लिए उपयोग किया है:

function quotemeta (str) { 
    // http://kevin.vanzonneveld.net 
    // + original by: Paulo Freitas 
    // *  example 1: quotemeta(". + * ?^($)"); 
    // *  returns 1: '\. \+ \* \? \^ \(\$ \)' 
    return (str + '').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g, '\\$1'); 
} 

से http://phpjs.org/functions/quotemeta:496

+0

अच्छा सीधे आगे कार्यान्वयन से प्यार – ZJR

1

वहाँ भी एक quotemeta npm module है, तो आप जो node.js या ब्राउज़र में उपयोग कर सकते हैं। कार्यान्वयन सभी गैर-शब्द वर्णों को उद्धृत करना है, ([^a-zA-Z0-9_] के लिए छोटा)।

String(str).replace(/(\W)/g, '\\$1'); 

यह काम करता है क्योंकि बचने वाले सभी पात्रों को गैर-शब्द हैं, जबकि अन्य पात्र जो बचने वाले हैं वे हानिरहित हैं। उदाहरण के लिए, यहां प्रतिशत चरित्र बच गए हो जाता है, लेकिन यह अभी भी हालांकि यह भाग निकले किए जाने की जरूरत नहीं थी, रेगुलर एक्सप्रेशन में सामान्य रूप से मेल खाता है:

if ("Hello%".match(RegExp(String("%").replace(/(\W)/g,'\\$1')))) { console.log("matched!"); } 

`` `

किसी quotemeta मॉड्यूल काँटेदार गया है और ध्यान दिया गया है कि कैप्चरिंग पैरों की आवश्यकता नहीं है, इसलिए रेगेक्स को और अधिक सरल बनाया जा सकता है:

String(str).replace(/\W/g, '\\$&'); 
+1

ध्यान दें कि यह बीच में बैकस्लैश के साथ उन्हें तोड़कर सरोगेट जोड़े तोड़ देगा, – Kovensky

+0

जैसे वर्णों को दूषित कर रहा है यदि कोई समाधान है, तो कृपया उद्धरण मॉड्यूल में पीआर जमा करें और इस उत्तर को संपादित करें। –

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