javascript - जावास्क्रिप्ट टिप्पणियों के मिलान/प्रतिस्थापन के लिए RegEx(मल्टीलाइन और इनलाइन दोनों)




comments replace (7)

इसे इस्तेमाल करे,

(\/\*[\w\'\s\r\n\*]*\*\/)|(\/\/[\w\s\']*)|(\<![\-\-\s\w\>\/]*\>)

कार्य करना चाहिए :)

मुझे जावास्क्रिप्ट RegExp ऑब्जेक्ट का उपयोग कर जावास्क्रिप्ट स्रोत से सभी जावास्क्रिप्ट टिप्पणियों को हटाने की जरूरत है।

मुझे क्या चाहिए RegExp के लिए पैटर्न है।

अब तक, मुझे यह मिल गया है:

compressed = compressed.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, '');

यह पैटर्न ठीक काम करता है:

/* I'm a comment */

या के लिए:

/*
 * I'm a comment aswell
*/

लेकिन इनलाइन के लिए काम नहीं लग रहा है:

// I'm an inline comment

मैं RegEx और इसके पैटर्न के लिए काफी विशेषज्ञ नहीं हूं, इसलिए मुझे सहायता चाहिए।

साथ ही, मैं एक RegEx पैटर्न रखना चाहता हूं जो उन सभी HTML- जैसी टिप्पणियों को हटा देगा।

<!-- HTML Comment //--> or <!-- HTML Comment -->

और उन सशर्त HTML टिप्पणियां, जो विभिन्न जावास्क्रिप्ट स्रोतों में पाई जा सकती हैं।

धन्यवाद।


उपर्युक्त प्रयासों के आधार पर और अल्ट्राएडिट का उपयोग करते हुए, ज्यादातर अभिषेक साइमन, मैंने इसे इनलाइन टिप्पणियों के लिए काम करने के लिए पाया और टिप्पणी के सभी पात्रों को संभाला।

(\s\/\/|$\/\/)[\w\s\W\S.]*

यह पंक्ति की शुरुआत में या // से पहले एक स्थान के साथ टिप्पणियों से मेल खाता है

// सार्वजनिक स्थिर अंतिम स्ट्रिंग LETTERS_WORK_FOLDER = "/ पत्र / जेनरेट / वर्क";

लेकिन नहीं

"http://schemas.us.com.au/hub/ '>" +

तो यह कुछ ऐसा करने के लिए अच्छा नहीं है

अगर (x) {f (x)} // जहां f कुछ फ़ंक्शन है

यह सिर्फ होना चाहिए

अगर (x) {f (x)} // जहां f कार्य करता है


मुझे आश्चर्य है कि क्या यह छात्रों के लिए प्रोफेसर द्वारा दिया गया एक चाल प्रश्न था। क्यूं कर? क्योंकि ऐसा लगता है कि सामान्य अभिव्यक्तियों में नियमित अभिव्यक्तियों के साथ ऐसा करने के लिए असंभव है।

आपका (या जो भी कोड है) इसमें इस तरह की वैध जावास्क्रिप्ट हो सकती है:

let a = "hello /* ";
let b = 123;
let c = "world */ ";

अब यदि आपके पास regexp है जो / * और * / की जोड़ी के बीच सबकुछ हटा देता है, तो यह ऊपर दिए गए कोड को तोड़ देगा, यह मध्य में निष्पादन योग्य कोड को भी हटा देगा।

यदि आप एक regexp तैयार करने का प्रयास करते हैं जो उद्धरण वाले टिप्पणियों को नहीं हटाएगा तो आप ऐसी टिप्पणियां नहीं हटा सकते हैं। यह सिंगल-कोट, डबल-कोट्स और बैक-कोट्स पर लागू होता है।

आप जावास्क्रिप्ट में नियमित अभिव्यक्तियों के साथ (सभी) टिप्पणियां नहीं हटा सकते हैं, ऐसा लगता है, शायद कोई ऊपर बताए गए मामले के लिए इसे कैसे कर सकता है।

आप क्या कर सकते हैं एक छोटे पार्सर का निर्माण होता है जो चरित्र चरित्र के माध्यम से चरित्र चरित्र के माध्यम से जाता है और जानता है कि यह स्ट्रिंग के अंदर कब होता है और जब यह किसी टिप्पणी के अंदर होता है, और जब यह एक स्ट्रिंग के अंदर एक टिप्पणी के अंदर होता है।

मुझे यकीन है कि अच्छे ओपन सोर्स जावास्क्रिप्ट पार्सर्स हैं जो यह कर सकते हैं। हो सकता है कि कुछ पैकेजिंग और खनन उपकरण आपके लिए भी ऐसा कर सकें।


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

@ रयान व्हेल के जवाब के आधार पर, मुझे यह सुनिश्चित करने के लिए एक व्यापक कैप्चर के रूप में काम करने के लिए मिला है कि मैचों में स्ट्रिंग के अंदर पाए गए कुछ भी शामिल नहीं हैं।

/(?:\r\n|\n|^)(?:[^'"])*?(?:'(?:[^\r\n\\']|\\'|[\\]{2})*'|"(?:[^\r\n\\"]|\\"|[\\]{2})*")*?(?:[^'"])*?(\/\*(?:[\s\S]*?)\*\/|\/\/.*)/g

अंतिम समूह (अन्य सभी को त्याग दिया जाता है) रायन के उत्तर पर आधारित है। here उदाहरण

यह मानता है कि कोड अच्छी तरह से संरचित और वैध जावास्क्रिप्ट है।

नोट: यह खराब संरचित कोड पर परीक्षण नहीं किया गया है जो जावास्क्रिप्ट इंजन के अपने हेरिस्टिक्स के आधार पर पुनर्प्राप्त करने योग्य हो सकता है या नहीं।

नोट: यह वैध जावास्क्रिप्ट <ES6 के लिए होना चाहिए, हालांकि, ES6 मल्टी-लाइन स्ट्रिंग अक्षर की अनुमति देता है , इस मामले में यह रेगेक्स लगभग निश्चित रूप से टूट जाएगा, हालांकि उस मामले का परीक्षण नहीं किया गया है।

हालांकि, रेगेक्स शाब्दिक के अंदर एक टिप्पणी की तरह दिखने वाला कुछ भी मिलान करना संभव है (ऊपर दिए गए उदाहरण में टिप्पणियां / परिणाम देखें)।

मैं इस प्रश्न के उत्तर में माइक सैमुअल के जवाब में संदर्भित अनुसार here और here ईएस 5-लेक्सर से निकाले गए निम्नलिखित व्यापक कैप्चर का उपयोग करके सभी रेगेक्स अक्षरों को प्रतिस्थापित करने के बाद उपरोक्त कैप्चर का उपयोग करता हूं:

/(?:(?:break|case|continue|delete|do|else|finally|in|instanceof|return|throw|try|typeof|void|[+]|-|[.]|[/]|,|[*])|[!%&(:;<=>?[^{|}~])?(\/(?![*/])(?:[^\\\[/\r\n\u2028\u2029]|\[(?:[^\]\\\r\n\u2028\u2029]|\\(?:[^\r\n\u2028\u2029ux]|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{2}))+\]|\\(?:[^\r\n\u2028\u2029ux]|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{2}))*\/[gim]*)/g

पूर्णता के लिए, यह छोटी सी चेतावनी भी देखें।


यदि आप नीचे दिए गए लिंक पर क्लिक करते हैं तो आपको रेगेक्स में लिखी गई एक टिप्पणी हटाने वाली स्क्रिप्ट मिलती है।

ये कोड से 112 लाइनें हैं जो एक साथ काम करते हैं, मूटूल और जूमला और ड्रूपल और अन्य सीएमएस वेबसाइटों के साथ भी काम करते हैं। कोड और टिप्पणियों की 800,000 लाइनों पर इसका परीक्षण किया। ठीक काम करता है। यह भी कई मूलभूत चुनता है जैसे कि (एबीसी (/ एनएन / ('/ xvx /')) "// परीक्षण रेखा") और टिप्पणियां जो कोलों के बीच हैं और उनकी रक्षा करती हैं। 23-01-2016 ..! यह टिप्पणी में कोड के साथ कोड है। !!!!

यहां क्लिक करे


यह लगभग सभी मामलों के लिए काम करता है:

var RE_BLOCKS = new RegExp([
  /\/(\*)[^*]*\*+(?:[^*\/][^*]*\*+)*\//.source,           // $1: multi-line comment
  /\/(\/)[^\n]*$/.source,                                 // $2 single-line comment
  /"(?:[^"\\]*|\\[\S\s])*"|'(?:[^'\\]*|\\[\S\s])*'/.source, // - string, don't care about embedded eols
  /(?:[$\w\)\]]|\+\+|--)\s*\/(?![*\/])/.source,           // - division operator
  /\/(?=[^*\/])[^[/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[/\\]*)*?\/[gim]*/.source
  ].join('|'),                                            // - regex
  'gm'  // note: global+multiline with replace() need test
);

// remove comments, keep other blocks
function stripComments(str) {
  return str.replace(RE_BLOCKS, function (match, mlc, slc) {
    return mlc ? ' ' :         // multiline comment (replace with space)
           slc ? '' :          // single/multiline comment
           match;              // divisor, regex, or string, return as-is
  });
}

कोड jspreproc से regexes पर आधारित है, मैंने दंगा संकलक के लिए यह उपकरण लिखा था।

http://github.com/aMarCruz/jspreproc देखें


नोट: रेगेक्स एक लेजर या पार्सर नहीं है यदि आपके पास कुछ अजीब किनारे का मामला है जहां आपको स्ट्रिंग से बाहर की गई कुछ अजीब नेस्टेड टिप्पणियों की आवश्यकता है, तो एक पार्सर का उपयोग करें। इस 98% समय के लिए इस रेगेक्स को काम करना चाहिए।

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

http://upshots.org/javascript/javascript-regexp-to-remove-comments
(मूल के लिए नीचे देखें)

कुछ संशोधन किए गए हैं, लेकिन मूल regex की अखंडता संरक्षित किया गया है। कुछ डबल-स्लैश ( // ) अनुक्रमों (जैसे यूआरएल) की अनुमति देने के लिए, आपको खाली स्ट्रिंग के बजाय अपने प्रतिस्थापन मान में वापस संदर्भ $1 उपयोग करना होगा । यह रहा:

/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm

// JavaScript: 
// source_string.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '$1');

// PHP:
// preg_replace("/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/m", "$1", $source_string);

डेमो: http://www.regextester.com/?fam=96247

उपयोग करने में विफलता: कुछ किनारे के मामले हैं जहां यह रेगेक्स विफल रहता है। उन मामलों की एक सतत सूची इस सार्वजनिक जिस्ट में दस्तावेज है। अगर आप अन्य मामलों को पा सकते हैं तो कृपया जिस्ट अपडेट करें।

... और यदि आप <!-- html comments --> भी निकालना चाहते हैं <!-- html comments --> इसका उपयोग करें:

/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*|<!--[\s\S]*?-->$/

(मूल - केवल ऐतिहासिक संदर्भ के लिए)

/(\/\*([\s\S]*?)\*\/)|(\/\/(.*)$)/gm




replace