javascript - जावास्क्रिप्ट रेगेक्स में उपयोग के लिए स्ट्रिंग से बचें



regex escaping (1)

संभावित डुप्लिकेट:
क्या जावास्क्रिप्ट में एक RegExp.escape फ़ंक्शन है?

मैं उपयोगकर्ता इनपुट के आधार पर जावास्क्रिप्ट रेगेक्स बनाने की कोशिश कर रहा हूं:

function FindString(input) {
    var reg = new RegExp('' + input + '');
    // [snip] perform search
}

लेकिन उपयोगकर्ता इनपुट में एक regex सही ढंग से काम नहीं करेगा ? या * क्योंकि उन्हें रेगेक्स स्पेशल के रूप में व्याख्या किया जाता है। वास्तव में, यदि उपयोगकर्ता असंतुलित रखता है ( या [ उनकी स्ट्रिंग में, रेगेक्स भी वैध नहीं है।

रेगेक्स में उपयोग के लिए सभी विशेष पात्रों से सही ढंग से बचने के लिए जावास्क्रिप्ट फ़ंक्शन क्या है?


लघु 'एन मीठा

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

उदाहरण

escapeRegExp("All of these should be escaped: \ ^ $ * + ? . ( ) | { } [ ]");

>>> "All of these should be escaped: \\ \^ \$ \* \+ \? \. \( \) \| \{ \} \[ \] "

इंस्टॉल करें

एनपीएम पर escape-string-regexp रेगेक्सपी के रूप में उपलब्ध है

npm install --save escape-string-regexp

ध्यान दें

एमडीएन देखें : जावास्क्रिप्ट गाइड: नियमित अभिव्यक्तियां

अन्य प्रतीकों (~ `! @ # ...) परिणाम के बिना बच निकले, लेकिन होने की आवश्यकता नहीं है।

टेस्ट केस: एक ठेठ यूआरएल

escapeRegExp("/path/to/resource.html?search=query");

>>> "\/path\/to\/resource\.html\?search=query"

लंबा जवाब

यदि आप अपने कोड के दस्तावेज़ में इस स्टैक ओवरफ़्लो पोस्ट के कम से कम लिंक के ऊपर दिए गए फ़ंक्शन का उपयोग करने जा रहे हैं, तो यह पागल हार्ड-टू-टेस्ट वूडू जैसा दिखता नहीं है।

var escapeRegExp;

(function () {
  // Referring to the table here:
  // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp
  // these characters should be escaped
  // \ ^ $ * + ? . ( ) | { } [ ]
  // These characters only have special meaning inside of brackets
  // they do not need to be escaped, but they MAY be escaped
  // without any adverse effects (to the best of my knowledge and casual testing)
  // : ! , = 
  // my test "[email protected]#$%^&*(){}[]`/=?+\|-_;:'\",<.>".match(/[\#]/g)

  var specials = [
        // order matters for these
          "-"
        , "["
        , "]"
        // order doesn't matter for any of these
        , "/"
        , "{"
        , "}"
        , "("
        , ")"
        , "*"
        , "+"
        , "?"
        , "."
        , "\\"
        , "^"
        , "$"
        , "|"
      ]

      // I choose to escape every character with '\'
      // even though only some strictly require it when inside of []
    , regex = RegExp('[' + specials.join('\\') + ']', 'g')
    ;

  escapeRegExp = function (str) {
    return str.replace(regex, "\\$&");
  };

  // test escapeRegExp("/path/to/res?search=this.that")
}());





escaping