जावास्क्रिप्ट रेगेक्स: एक नियमित अभिव्यक्ति के अंदर एक चर कैसे लगाया जाए?


206

उदाहरण के लिए:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

लेकिन यह निश्चित रूप से काम नहीं कर रहा है :) क्या ऐसा करने का कोई तरीका है?


11
ध्यान रखें कि यदि आप उपयोगकर्ता को इस चर की आपूर्ति करते हैं, तो दुर्भावनापूर्ण उपयोगकर्ता के लिए आपके एप्लिकेशन को भयावह बैकट्रैकिंग के माध्यम से क्रैश करना आसान है।
टिम पीटरज़ॉक्ट

2
"ReGeX" क्या है? यह एक चर नाम है? यह जवाब देने से भ्रमित करता है कि यह RegExp निर्माण का एक हिस्सा है (यदि किसी पाठक ने प्रश्न में उन अजीब पात्रों को नहीं देखा है)।
एडुआर्ड

जवाबों:


272
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

अपडेट करें

कुछ टिप्पणियों के अनुसार, यह ध्यान देना महत्वपूर्ण है कि आप कर सकते हैं कि भागने चर अगर वहाँ दुर्भावनापूर्ण सामग्री के लिए क्षमता है (उदाहरण के लिए चर उपयोगकर्ता इनपुट से आता है)

ईएस 6 अपडेट

2019 में, यह आमतौर पर टेम्पलेट स्ट्रिंग का उपयोग करके लिखा जाएगा, और उपरोक्त कोड को अपडेट किया गया है। मूल उत्तर था:

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

5
अपनी स्ट्रिंग से बचने के लिए सुनिश्चित करें! @ZzzzBov उत्तर देखें
jtpereyda

यह मेरे मामले में काम नहीं कर रहा है, क्या आप कृपया इस jsfiddle को देख सकते हैं और मुझे बता सकते हैं कि अगर मुझे regexअभिव्यक्ति में एक देश कोड डायनामिक सेट करना है तो मुझे क्या करना है
किरणकुमार दफदा

10
याद रखने वाली एक महत्वपूर्ण बात यह है कि रेगुलर स्ट्रिंग्स में the \ चरित्र को बचना होता है जबकि regex में शाब्दिक (आमतौर पर) / वर्ण को भाग जाने की आवश्यकता होती है। तो /\w+\//iबन जाता हैnew RegExp("\\w+/", "i")
अली

3
कैसे / जी के बारे में?
कियान चेन

दोस्तों, मुझे इस regex को विभाजित करने की आवश्यकता है / / २.२०१ ९-९। -डिंग्स / दो भागों द्वारा: / [^ ०- ९ और -] / g इसे कैसे करें?
अधिकतम

79

आप RegExp ऑब्जेक्ट का उपयोग कर सकते हैं:

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

फिर आप regexstringकिसी भी तरह से निर्माण कर सकते हैं।

आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं ।


var characterCount = parseInt (attrs.limitCharacterCount); console.log (characterCount); var specialCharactersValidation = new RegExp ("/ ^ [a-zA-Z0-9] {" + characterCount + "} $ /"); / \ / ^ [a-zA-Z0-9] {7} $ \ / requestShipmentDirectives.js: 76 मिथ्या main.js: 46 बिना पढ़ा हुआ टाइपर: संपत्ति को नहीं पढ़ा जा सकता है 'ऑफसेट की अशांति' यह तब होता है जब मैं बना होता हूं RegEx गतिशील।
अंकित तन्ना

31

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

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

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

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

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

मेरे लिए काम करने का एकमात्र तरीका यह था कि मैं ReGeXपाठ को हटा दूं । इसलिए मैंने इस्तेमाल किया:return new RegExp(input, flags);
माइकल रेडर

2
@MichaelRader, हाँ, "ReGeX" पाठ प्रश्न का हिस्सा था और एक उदाहरण के रूप में इस्तेमाल किया गया था, न कि कुछ के रूप में जो कोड काम करने के लिए आवश्यक है।
zzzzBov

1
lol ने महसूस किया कि सिर्फ आपका प्लेसहोल्डर था, लेकिन एक noob के रूप में मुझे यह पता लगाने में थोड़ी देर लगी। धन्यवाद।
माइकल रेडर

मैं समझता हूं कि स्ट्रिंग से बचने की आवश्यकता क्यों है। लेकिन '\\ $ &' ​​का उपयोग प्रतिस्थापन के रूप में क्यों किया जाता है
शेरिन बीनू

2
\\एक एकल \चरित्र का प्रतिनिधित्व करता $&है, मिलान किया हुआ विकल्प है
zzzzBov

7

यदि आप es6 टेम्पलेट का उपयोग कर रहे हैं, तो शाब्दिक विकल्प हैं ...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")

यह टेम्पलेट शाब्दिक के साथ काम नहीं करता है। मैं अपने ऐप में पासवर्ड को मान्य करने के लिए regexp का उपयोग कर रहा हूं, और मैं अपने नियमित अभिव्यक्ति स्ट्रिंग में अधिकतम और न्यूनतम लंबाई तक पैरामीरिज करना चाहता था और यह काम नहीं करता है। `` `newRegExp = new RegExp ( ^[^\s]{${4},${32}}$); निर्यात कांस्ट वैध `` `
p7adams

6

आप हमेशा स्ट्रिंग के रूप में नियमित अभिव्यक्ति दे सकते हैं, अर्थात "ReGeX" + testVar + "ReGeX"। आपको संभवतः अपने स्ट्रिंग (जैसे, दोहरे उद्धरण) के अंदर कुछ पात्रों से बचना होगा, लेकिन अधिकांश मामलों के लिए यह समकक्ष है।

आप RegExpझंडे को पास करने के लिए कंस्ट्रक्टर का उपयोग कर सकते हैं ( डॉक्स देखें )।


3

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

  1. नियमित अभिव्यक्ति शाब्दिक का उपयोग करना - /ab{2}/g
  2. नियमित अभिव्यक्ति निर्माता का उपयोग करना - new RegExp("ab{2}", "g")

नियमित अभिव्यक्ति शाब्दिक स्थिर हैं, और इसका उपयोग चर के साथ नहीं किया जा सकता है। यह कंस्ट्रक्टर का उपयोग करके प्राप्त किया जा सकता है। RegEx कंस्ट्रक्टर का फ्रैक्चर है

new RegExp(regularExpressionString, modifiersString)

आप regularExpressionString के भाग के रूप में चर एम्बेड कर सकते हैं। उदाहरण के लिए,

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

यह पैटर्न के किसी भी रूप से मेल खाएगा cdcdcd


2

यहां एक बहुत ही बेकार फ़ंक्शन है जो विशिष्ट वर्णों द्वारा लिपटे मूल्यों को वापस करता है। :)

jsfiddle: https://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)

2

स्वीकृत उत्तर मेरे लिए काम नहीं करता है और एमडीएन उदाहरणों का पालन नहीं करता है

उपरोक्त लिंक में 'विवरण' अनुभाग देखें

मैं निम्नलिखित के साथ चलूँगा जो मेरे लिए काम कर रहा है:

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi

1
यह अभी भी काम करता है। मुद्दा यह है कि 'ReGeX' + testVar + 'ReGeX' समाधान को भ्रमित करता है। वास्तव में उदाहरण जोड़ने से मेरी राय में चीजें साफ हो जाएंगी। var testVar = '321'; var regex = new RegExp ("[" + testVar + "] {2}", "g"); // के बराबर / [321] {2} / जी
हैलोवर्ल्डपीस

1

केवल पहले स्ट्रिंग चर तैयार करना आवश्यक है और फिर इसे RegEx में परिवर्तित करें।

उदाहरण के लिए:

आप जोड़ना चाहते हैं minLengthऔर MaxLengthचर के साथ RegEx:

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

अब यदि आप मान बदलते हैं MaxLengthया MinLength, यह सभी RegExs में बदल जाएगा।

उपयोगी होने की उम्मीद है। मेरी अंग्रेजी के बारे में भी खेद है।

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