खोज…


वाक्य - विन्यास

  • रेगेक्स = / पैटर्न / [ झंडे ]
  • regex = new RegExp (' पैटर्न ', [ झंडे ])
  • Let ismatch = regex.test (' पाठ ')
  • परिणाम दें = regex.exec (' पाठ ')

पैरामीटर

झंडे विवरण
जी जी लोबाल सभी मैच (पहले मैच में वापसी नहीं)।
मी अल्टी-लाइन। कारण ^ और $ प्रत्येक पंक्ति के आरंभ / अंत से मेल खाने के लिए (न केवल आरंभ / अंत स्ट्रिंग के)।
मैं मैं nsensitive केस असंवेदनशील मिलान ([a-zA-Z] का मामला अनदेखा)।
यू यू निकोड: पैटर्न स्ट्रिंग्स को UTF-16 के रूप में माना जाता है। यूनिकोड के पात्रों से मेल खाने के लिए एस्केप सीक्वेंस भी हैं।
y छड़ी y : केवल लक्ष्य स्ट्रिंग में इस नियमित अभिव्यक्ति के अंतिम गुण द्वारा इंगित सूचकांक से मेल खाता है (और बाद के किसी भी सूचकांक से मिलान करने का प्रयास नहीं करता है)।

टिप्पणियों

RegExp ऑब्जेक्ट केवल उतना ही उपयोगी है जितना कि रेगुलर एक्सप्रेशंस का आपका ज्ञान मजबूत है। एक परिचयात्मक प्राइमर के लिए यहां देखें , या अधिक गहराई से स्पष्टीकरण के लिए एमडीएन देखें।

RegExp ऑब्जेक्ट बनाना

मानक निर्माण

डायनामिक वैरिएबल से रेगेक्स बनाते समय केवल इस फॉर्म का उपयोग करने की सिफारिश की जाती है।

जब अभिव्यक्ति परिवर्तित हो सकती है या अभिव्यक्ति उत्पन्न होती है तो प्रयोग करें।

var re = new RegExp(".*");

झंडे के साथ:

var re = new RegExp(".*", "gmi");

बैकस्लैश के साथ: (यह बच जाना चाहिए क्योंकि रेग्ज एक स्ट्रिंग के साथ निर्दिष्ट है)

var re = new RegExp("\\w*");

स्थैतिक आरंभ

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

var re = /.*/;

झंडे के साथ:

var re = /.*/gmi;

बैकस्लैश के साथ: (यह बच नहीं जाना चाहिए क्योंकि रेगेक्स एक शाब्दिक रूप में निर्दिष्ट है)

var re = /\w*/;

RegExp झंडे

ऐसे कई झंडे हैं जिन्हें आप RegEx व्यवहार को बदलने के लिए निर्दिष्ट कर सकते हैं। फ्लैग को रेगेक्स शाब्दिक के अंत में जोड़ा जा सकता है, जैसे कि gi /test/gi in /test/gi को निर्दिष्ट करना, या वे RegExp कंस्ट्रक्टर के दूसरे तर्क के रूप में निर्दिष्ट किया जा सकता है, जैसा कि new RegExp('test', 'gi')

g - ग्लोबल। पहले के बाद रुकने के बजाय सभी मैच ढूंढता है।

i - मामले पर ध्यान न दें। /[az]/i के बराबर /[a-zA-Z]/

m - बहुस्तरीय। ^ और $ प्रत्येक पंक्ति की शुरुआत और अंत से मेल खाते हैं और क्रमशः \n और \r को संपूर्ण स्ट्रिंग की शुरुआत और अंत के बजाय सीमांकक मानते हैं।

6

u - यूनिकोड। यदि यह ध्वज समर्थित नहीं है, तो आपको \uXXXX वर्णों के साथ विशिष्ट यूनिकोड वर्णों से मेल खाना चाहिए जहां XXXX \uXXXX में वर्ण का मान है।

y - सभी लगातार / आसन्न मैचों को ढूँढता है।

.Exec () के साथ मिलान

मैच का उपयोग कर .exec()

RegExp.prototype.exec(string) एक कैप्चर का एक सरणी देता है, या कोई मैच न होने पर null

var re = /([0-9]+)[a-z]+/;
var match = re.exec("foo123bar");

match.index 3 है, मैच का स्थान (शून्य-आधारित)।

match[0] पूर्ण मैच स्ट्रिंग है।

match[1] पहले कैप्चर किए गए समूह के अनुरूप पाठ है। match[n] एन वें पर कब्जा कर लिया समूह का मूल्य होगा।

मैचों के माध्यम से लूप का उपयोग करना .exec()

var re = /a/g;
var result;
while ((result = re.exec('barbatbaz')) !== null) {
    console.log("found '" + result[0] + "', next exec starts at index '" + re.lastIndex + "'");
}

अपेक्षित उत्पादन

पाया 'ए', अगला निष्पादन सूचकांक '2' से शुरू होता है
पाया 'a', अगला निष्पादन '5' पर शुरू होता है
पाया 'a', अगला निष्पादन '8' पर शुरू होता है

जाँच करें कि क्या स्ट्रिंग में .test () का उपयोग करने वाला पैटर्न है

var re = /[a-z]+/;
if (re.test("foo")) {
    console.log("Match exists.");
}

test पद्धति यह देखने के लिए एक खोज करती है कि क्या एक नियमित अभिव्यक्ति एक स्ट्रिंग से मेल खाती है। नियमित अभिव्यक्ति [az]+ एक या अधिक लोअरकेस अक्षरों की खोज करेगी। चूंकि पैटर्न स्ट्रिंग से मेल खाता है, "मिलान मौजूद है" कंसोल में लॉग किया जाएगा।

स्ट्रिंग्स के साथ RegExp का उपयोग करना

स्ट्रिंग ऑब्जेक्ट में निम्न विधियाँ होती हैं जो नियमित अभिव्यक्तियों को तर्क के रूप में स्वीकार करती हैं।

  • "string".match(...
  • "string".replace(...
  • "string".split(...
  • "string".search(...

RegExp के साथ मैच

console.log("string".match(/[i-n]+/));
console.log("string".match(/(r)[i-n]+/));

अपेक्षित उत्पादन

Array ["in"]
ऐरे ["रिन", "आर"]

RegExp से बदलें

console.log("string".replace(/[i-n]+/, "foo"));

अपेक्षित उत्पादन

strfoog

RegExp के साथ विभाजित करें

console.log("stringstring".split(/[i-n]+/));

अपेक्षित उत्पादन

Array ["str", "gstr", "g"]

RegExp के साथ खोजें

.search() उस सूचकांक को लौटाता है जिस पर एक मैच पाया जाता है या -1।

console.log("string".search(/[i-n]+/));
console.log("string".search(/[o-q]+/));

अपेक्षित उत्पादन

3
-1

कॉलबैक फ़ंक्शन के साथ स्ट्रिंग मैच को बदलना

String#replace में इसके दूसरे तर्क के रूप में एक फ़ंक्शन हो सकता है ताकि आप कुछ तर्क के आधार पर प्रतिस्थापन प्रदान कर सकें।

"Some string Some".replace(/Some/g, (match, startIndex, wholeString) => {
  if(startIndex == 0){
    return 'Start';
  } else {
    return 'End';
  }
});
// will return Start string End

एक लाइन टेम्पलेट पुस्तकालय

let data = {name: 'John', surname: 'Doe'}
"My name is {surname}, {name} {surname}".replace(/(?:{(.+?)})/g, x => data[x.slice(1,-1)]);

// "My name is Doe, John Doe"

RegExp समूह

जावास्क्रिप्ट यह नियमित एक्सप्रेशंस, कैप्चर ग्रुप , नॉन-कैप्चर ग्रुप और लुक-अहेड्स में कई प्रकार के समूह का समर्थन करता है। वर्तमान में, वहाँ कोई लुक-पीछे समर्थन है।

कब्जा

कभी-कभी वांछित मैच इसके संदर्भ पर निर्भर करता है। इसका मतलब यह है कि एक साधारण RegExp स्ट्रिंग के उस टुकड़े को ढूंढ लेगा जो ब्याज का है, इसलिए इसका समाधान कैप्चर ग्रुप (pattern) लिखना है। कैप्चर किए गए डेटा को तब संदर्भित किया जा सकता है ...

  • स्ट्रिंग प्रतिस्थापन "$n" जहां n n n कैप्चर ग्रुप है ( 1 से शुरू)
  • N कॉलबैक फ़ंक्शन में n तर्क
  • RegExp फ़्लैग नहीं किया गया तो g , n + 1 एक लौटे में वें आइटम str.match सरणी
  • RegExp फ्लैग किए गए है, तो g , str.match छोड देता है कैप्चर, उपयोग re.exec बजाय

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

let str = "aa+b+cc+1+2",
    re = /([a-z])\+/g;

// String replacement
str.replace(re, '$1 '); // "aa b cc 1+2"
// Function replacement
str.replace(re, (m, $1) => $1 + ' '); // "aa b cc 1+2"

गैर कैद

फॉर्म (?:pattern) का उपयोग करके, ये समूहों को पकड़ने के लिए एक समान तरीके से काम करते हैं, सिवाय इसके कि वे मैच के बाद समूह की सामग्री को स्टोर नहीं करते हैं।

वे विशेष रूप से उपयोगी हो सकते हैं यदि अन्य डेटा कैप्चर किया जा रहा है, जिसे आप सूचकांकों को स्थानांतरित नहीं करना चाहते हैं, लेकिन ऐसा करने के लिए कुछ उन्नत पैटर्न से मेल खाने की आवश्यकता है

let str = "aa+b+cc+1+2",
    re = /(?:\b|c)([a-z])\+/g;

str.replace(re, '$1 '); // "aa+b c 1+2"

भविष्य का ध्यान करना

यदि वांछित मैच किसी ऐसी चीज पर निर्भर करता है, जो उसका अनुसरण करने और उस पर कब्जा करने के बजाय, उसका परीक्षण करने के लिए लुक-फॉरवर्ड का उपयोग करना संभव है, लेकिन इसे मैच में शामिल नहीं करता है। एक पॉजिटिव लुक-फ़ॉरवर्ड में फॉर्म (?=pattern) , एक नेगेटिव लुक-फ़ॉरवर्ड (जहाँ एक्सप्रेशन मैच केवल तभी होता है जब लुक-फ़ॉरवर्ड पैटर्न मैच नहीं करता था) का फॉर्म (?!pattern)

let str = "aa+b+cc+1+2",
    re = /\+(?=[a-z])/g;

str.replace(re, ' '); // "aa b cc+1+2"

एक स्ट्रिंग के मैचों को निकालने के लिए कोष्ठक regex के साथ Regex.exec () का उपयोग करना

कभी-कभी आप केवल स्ट्रिंग को बदलना या निकालना नहीं चाहते हैं। कभी-कभी आप मैच निकालना और संसाधित करना चाहते हैं। यहां एक उदाहरण है कि आप मैचों में कैसे हेरफेर करते हैं।

क्या मेल है? जब स्ट्रिंग में संपूर्ण रेगेक्स के लिए एक संगत सबस्ट्रिंग पाया जाता है, तो निष्पादन कमांड एक मैच का उत्पादन करता है। एक मैच एक सरणी है जो सबसे पहले पूरे सबस्टेशन से मेल खाता है और मैच में सभी कोष्ठक।

HTML स्ट्रिंग की कल्पना करें:

<html>
<head></head>
<body>
  <h1>Example</h1>
  <p>Look a this great link : <a href="https://stackoverflow.com">Stackoverflow</a> http://anotherlinkoutsideatag</p>
  Copyright <a href="https://stackoverflow.com">Stackoverflow</a>
</body>

आप a टैग के अंदर सभी लिंक निकालना और प्राप्त करना चाहते हैं। सबसे पहले, यहाँ रेगेक्स आप लिखते हैं:

var re = /<a[^>]*href="https?:\/\/.*"[^>]*>[^<]*<\/a>/g;

लेकिन अब, कल्पना कीजिए कि आप प्रत्येक लिंक के href और anchor चाहते हैं। और आप इसे एक साथ चाहते हैं। आप प्रत्येक मैच के लिए बस एक नया regex जोड़ सकते हैं या आप कोष्ठक का उपयोग कर सकते हैं:

var re = /<a[^>]*href="(https?:\/\/.*)"[^>]*>([^<]*)<\/a>/g; 
var str = '<html>\n    <head></head>\n    <body>\n        <h1>Example</h1>\n        <p>Look a this great link : <a href="https://stackoverflow.com">Stackoverflow</a> http://anotherlinkoutsideatag</p>\n\n        Copyright <a href="https://stackoverflow.com">Stackoverflow</a>\n    </body>\';\n';
var m;
var links = [];

while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    console.log(m[0]); // The all substring
    console.log(m[1]); // The href subpart
    console.log(m[2]); // The anchor subpart

    links.push({
      match : m[0],   // the entire match
      href : m[1],    // the first parenthesis => (https?:\/\/.*)
      anchor : m[2],  // the second one => ([^<]*)
    });
}

लूप के अंत में, आपके पास anchor और href साथ लिंक की एक सरणी है और आप इसका उपयोग उदाहरण के लिए मार्कडाउन लिखने के लिए कर सकते हैं:

links.forEach(function(link) {
  console.log('[%s](%s)', link.anchor, link.href);
});

आगे जाने के लिए :

  • नेकपीस नेस्टेड


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow