2013-07-26 4 views
33

में रेगेक्स पैटर्न के रूप में डायनामिक (वेरिएबल) स्ट्रिंग का उपयोग करें, मैं रीजिक्स के साथ मानों के लिए एक (चर) टैग जोड़ना चाहता हूं, पैटर्न PHP के साथ ठीक काम करता है लेकिन मुझे जावास्क्रिप्ट में इसे लागू करने में परेशानी होती है।जावास्क्रिप्ट

/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is 

मैं भाग निकले बैकस्लैश:

पैटर्न है (value चर रहा है)

var str = $("#div").html(); 
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is"; 
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>")); 

लेकिन यह सही नहीं होने लगते हैं, मैं पैटर्न लॉग इन किया और उसके वास्तव में यह क्या होना चाहिए। कोई विचार?

+0

'value' एक चर है? – Dogbert

उत्तर

77

स्ट्रिंग के रूप में रेगेक्स बनाने के लिए, आपको JavaScript's RegExp object का उपयोग करना होगा।

इसके अलावा, आप एक से अधिक बार मिलान/प्रतिस्थापित करना चाह सकते हैं। उस स्थिति में, the g (global match) flag जोड़ें। यहाँ एक उदाहरण है:

हर स्ट्रिंग, एक वैध regex है, हालांकि:

var stringToGoIntoTheRegex = "abc"; 
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g"); 
// at this point, the line above is the same as: var regex = /#abc#/g; 

var input = "Hello this is #abc# some #abc# stuff."; 
var output = input.replace(regex, "!!"); 
alert(output); // Hello this is !! some !! stuff. 

JSFiddle demo here.


सामान्य स्थिति में, regex के रूप में उपयोग करने से पहले स्ट्रिंग से बच: ( या [ जैसे कुछ विशिष्ट पात्र हैं। इस समस्या को हल करने के लिए, इसे रीगेक्स में बदलने से पहले स्ट्रिंग से बचें। उस के लिए एक उपयोगिता समारोह नीचे दिए नमूने में चला जाता है:

function escapeRegExp(stringToGoIntoTheRegex) { 
    return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
} 

var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above 
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g"); 
// at this point, the line above is the same as: var regex = /#abc#/g; 

var input = "Hello this is #abc# some #abc# stuff."; 
var output = input.replace(regex, "!!"); 
alert(output); // Hello this is !! some !! stuff. 

JSFiddle demo here.


प्रश्न में विशिष्ट मामले के लिए, नोटिस there is no s (dotall) flag/modifier in JavaScript। जहां यह उपलब्ध है, यह आमतौर पर न्यूलाइन से मेल खाने के लिए डॉट (.) को मजबूर करता है।यहाँ अपने मामले के लिए एक संभव समाधान है:

var str = $("#div").html(); 
var regexExpression ="(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b"; 
var regex = new RegExp(regexExpression, "i"); 
$("#div").html(str.replace(regex, "<a href='#" + value +"'>" + value + "</a>")); 

सूचना मैं "<a href='#" + value +"'>" के अंत में एक लापता ' गयी।

See demo fiddle here। आप this solution using the "g" modifier को भी आजमा सकते हैं।

+0

धन्यवाद, – Borstenhorst

+1

काम करता है यह बहुत अच्छा है और सबसे अच्छा उदाहरण Ive अब तक एक रेगेक्स में गतिशील चर का उपयोग करने के लिए मिला है, धन्यवाद! – Eolis

2

आप तो बस एक नियमित अभिव्यक्ति को परिभाषित करने के " की जरूरत नहीं है:

var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax 

तो value एक चर है और आप एक गतिशील नियमित अभिव्यक्ति तो आप इस संकेतन का उपयोग नहीं कर सकते हैं; वैकल्पिक नोटेशन का प्रयोग करें।

String.replace भी इनपुट के रूप में तार को स्वीकार करता है, तो आप क्या कर सकते हैं "fox".replace("fox", "bear");

वैकल्पिक:

var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/", "is"); 
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b/", "is"); 
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(.*?)\b/", "is"); 

ध्यान रखें कि यदि value(, [ और ? आप से बचने के लिए की आवश्यकता होगी रेगुलर एक्सप्रेशन वर्ण हैं उन्हें।

+1

पहला विकल्प तब तक काम नहीं करेगा जब तक कि "मान" –

+0

@happytimeharry की तलाश न हो, वह पोस्ट किए गए दो regexps के बीच एक संघर्ष लगता है। – Halcyon

+0

@ फ़्रिट्ज़ वैन कैम्पन ऐसा लगता है कि पैटर्न के इरादे से, उनके जावास्क्रिप्ट से उदाहरण दिया गया था, एक चर –

8

यदि आप अभिव्यक्ति में चर वैल्यू का उपयोग करने का प्रयास कर रहे हैं, तो आपको RegExp "constructor" का उपयोग करना होगा।

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b"; 
new RegExp(regex, "is") 
2

मुझे यह धागा उपयोगी पाया - इसलिए मैंने सोचा कि मैं अपनी समस्या का उत्तर जोड़ूंगा।

मैं जावास्क्रिप्ट में एक नोड अनुप्रयोग से डेटाबेस कॉन्फ़िगरेशन फ़ाइल (डेटास्टैक्स कैसंड्रा) को संपादित करना चाहता था और फ़ाइल में सेटिंग्स में से एक के लिए मुझे स्ट्रिंग पर मिलान करने के लिए आवश्यक था और उसके बाद लाइन को प्रतिस्थापित करें।

यह मेरा समाधान था।

कॉन्फ़िग फ़ाइल से पहले:

data_file_directories: 
    - /var/lib/cassandra/data 

कॉन्फ़िग फ़ाइल के बाद:

data_file_directories: 
- /mnt/cassandra/data 

dse_cassandra_yaml='/etc/dse/cassandra/cassandra.yaml' 

// a) find the searchString and grab all text on the following line to it 
// b) replace all next line text with a newString supplied to function 
// note - leaves searchString text untouched 
function replaceStringNextLine(file, searchString, newString) { 
fs.readFile(file, 'utf-8', function(err, data){ 
if (err) throw err; 
    // need to use double escape '\\' when putting regex in strings ! 
    var re = "\\s+(\\-\\s(.*)?)(?:\\s|$)"; 
    var myRegExp = new RegExp(searchString + re, "g"); 
    var match = myRegExp.exec(data); 
    var replaceThis = match[1]; 
    var writeString = data.replace(replaceThis, newString); 
    fs.writeFile(file, writeString, 'utf-8', function (err) { 
    if (err) throw err; 
     console.log(file + ' updated'); 
    }); 
}); 
} 

searchString = "data_file_directories:" 
newString = "- /mnt/cassandra/data" 

replaceStringNextLine(dse_cassandra_yaml, searchString, newString); 

चलाने के बाद, यह नया करने के लिए मौजूदा डेटा निर्देशिका सेटिंग बदल जाएगी

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