जावास्क्रिप्ट में रेगेक्स पैटर्न के रूप में डायनामिक (चर) स्ट्रिंग का उपयोग करें


101

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

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

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

मैं बैकस्लैश से बच गया:

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

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


है valueएक चर?
डॉगबर्ट

जवाबों:


173

एक स्ट्रिंग से रेगेक्स बनाने के लिए, आपको जावास्क्रिप्ट RegExpऑब्जेक्ट का उपयोग करना होगा

आप भी मेल खाते हैं / एक से अधिक समय बदलना चाहते हैं, तो आप चाहिए जोड़ने (वैश्विक मैच) झंडा । यहाँ एक उदाहरण है:g

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 डेमो।


सामान्य स्थिति में, रेगेक्स के रूप में उपयोग करने से पहले स्ट्रिंग से बच जाएं:

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

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 डेमो।



नोट: प्रश्न में रेगेक्स sसंशोधक का उपयोग करता है , जो प्रश्न के समय मौजूद नहीं था, लेकिन मौजूद है - जावास्क्रिप्ट में एक s( dotall ) ध्वज / संशोधक - आज


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

1
2019 के लिए s संशोधक है, उत्तर के नोट में फिर से एमडीएन लिंक देखें।
निकोलस

@Nickensoul अच्छी तरह से देखा! सर उठाने के लिए धन्यवाद!
२१:३

let idr = new RegExp (परिवर्तनशील + "$"); Table.find ({फ़ील्ड: नया RegExp (idr, 'i')}) मुझे यह पसंद आया। चीयर्स।
उत्कर्ष

12

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

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

6

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

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नियमित अभिव्यक्ति वाले अक्षर जैसे हैं (, [और ?आपको उनसे बचना होगा।


2
पहला विकल्प तब तक काम नहीं करेगा जब तक कि स्ट्रिंग "मूल्य" की तलाश में न हो
मॉथोनमॉस्टरमैन

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

@ फ्रिट्ज वैन कैंपेन ऐसा लगता है कि पैटर्न की मंशा, उनकी जावास्क्रिप्ट से उदाहरण देते हुए, एक चर का उपयोग करना था
मॉथोम्स्टरमैन

यहाँ एक ही समस्या है, वहाँ कुछ "गलत" झंडा है: "
बिना किसी वाक्यविन्यास के

RegExp के निर्माण के लिए झंडे को अलग करने की आवश्यकता है। लेकिन फिर भी रेगेक्स काम नहीं कर रहा है।
बोरस्टोनहॉस्ट

5

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

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

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

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 );

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

फ़ाइल को पहले कॉन्फ़िगर करें:

data_file_directories:  
   - /var/lib/cassandra/data

इसके बाद फ़ाइल को कॉन्फ़िगर करें:

data_file_directories:  
- /mnt/cassandra/data

4

मैंने पाया कि मुझे इसे काम करने के लिए \ b स्लैश डबल करना था। एक चर का उपयोग करके "1x" शब्दों को हटाने के लिए उदाहरण के लिए, मुझे उपयोग करने की आवश्यकता है:

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");

मेरे लिए काम किया। धन्यवाद,
प्रवीण भापकर

1

बहुत आसान तरीका: टेम्पलेट शाब्दिक का उपयोग करें।

var variable = 'foo'
var expression = `.*${variable}.*`
var re = new RegExp(expression, 'g')
re.test('fdjklsffoodjkslfd') // true
re.test('fdjklsfdjkslfd') // false

0
var string = "Hi welcome to stack overflow"
var toSearch = "stack"

//case insensitive search

var result = string.search(new RegExp(toSearch, "i")) > 0 ? 'Matched' : 'notMatched'

https://jsfiddle.net/9f0mb6Lz/

उम्मीद है की यह मदद करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.