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




comments replace (9)

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

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

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

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

लेकिन नहीं

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

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

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

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

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

मुझे जावास्क्रिप्ट 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 टिप्पणियां, जो विभिन्न जावास्क्रिप्ट स्रोतों में पाई जा सकती हैं।

धन्यवाद।


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

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

/(?:\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

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


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

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 देखें


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

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

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


नोट: रेगेक्स एक लेजर या पार्सर नहीं है यदि आपके पास कुछ अजीब किनारे का मामला है जहां आपको स्ट्रिंग से बाहर की गई कुछ अजीब नेस्टेड टिप्पणियों की आवश्यकता है, तो एक पार्सर का उपयोग करें। इस 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

मैं एक अभिव्यक्ति को जोड़ रहा हूं जिसे कुछ ऐसा करने की ज़रूरत है।
तैयार उत्पाद है:

/(?:((["'])(?:(?:\\\\)|\\\2|(?!\\\2)\\|(?!\2).|[\n\r])*\2)|(\/\*(?:(?!\*\/).|[\n\r])*\*\/)|(\/\/[^\n\r]*(?:[\n\r]+|$))|((?:=|:)\s*(?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/))|((?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/)[gimy]?\.(?:exec|test|match|search|replace|split)\()|(\.(?:exec|test|match|search|replace|split)\((?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/))|(<!--(?:(?!-->).)*-->))/g

डरावना सही है?

इसे तोड़ने के लिए, पहला भाग एकल या दोहरे उद्धरण चिह्नों के भीतर कुछ भी मेल खाता है
मिलान उद्धृत तारों से बचने के लिए यह आवश्यक है

((["'])(?:(?:\\\\)|\\\2|(?!\\\2)\\|(?!\2).|[\n\r])*\2)

दूसरा भाग multiline टिप्पणियों से मेल खाता है * * * /

(\/\*(?:(?!\*\/).|[\n\r])*\*\/)

तीसरा हिस्सा रेखा में कहीं भी शुरू होने वाली सिंगल लाइन टिप्पणियों से मेल खाता है

(\/\/[^\n\r]*(?:[\n\r]+|$))

छठे से छठे हिस्सों में रेगेक्स शाब्दिक के भीतर कुछ भी मिलता है
यह रेगेक्स कॉल से पहले या बाद में पहले के बराबर संकेत या शाब्दिक होने पर निर्भर करता है

((?:=|:)\s*(?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/))
((?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/)[gimy]?\.(?:exec|test|match|search|replace|split)\()
(\.(?:exec|test|match|search|replace|split)\((?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/))

और सातवां जो मैं मूल रूप से भूल गया था, एचटीएमएल टिप्पणियों को हटा देता है

(<!--(?:(?!-->).)*-->)

मुझे अपने देव पर्यावरण के साथ एक समस्या तोड़ने वाली रेगेक्स के लिए त्रुटियों को जारी करने में कोई समस्या थी, इसलिए मैंने निम्नलिखित समाधान का उपयोग किया

var ADW_GLOBALS = new Object
ADW_GLOBALS = {
  quotations : /((["'])(?:(?:\\\\)|\\\2|(?!\\\2)\\|(?!\2).|[\n\r])*\2)/,
  multiline_comment : /(\/\*(?:(?!\*\/).|[\n\r])*\*\/)/,
  single_line_comment : /(\/\/[^\n\r]*[\n\r]+)/,
  regex_literal : /(?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/)/,
  html_comments : /(<!--(?:(?!-->).)*-->)/,
  regex_of_doom : ''
}
ADW_GLOBALS.regex_of_doom = new RegExp(
  '(?:' + ADW_GLOBALS.quotations.source + '|' + 
  ADW_GLOBALS.multiline_comment.source + '|' + 
  ADW_GLOBALS.single_line_comment.source + '|' + 
  '((?:=|:)\\s*' + ADW_GLOBALS.regex_literal.source + ')|(' + 
  ADW_GLOBALS.regex_literal.source + '[gimy]?\\.(?:exec|test|match|search|replace|split)\\(' + ')|(' + 
  '\\.(?:exec|test|match|search|replace|split)\\(' + ADW_GLOBALS.regex_literal.source + ')|' +
  ADW_GLOBALS.html_comments.source + ')' , 'g'
);

changed_text = code_to_test.replace(ADW_GLOBALS.regex_of_doom, function(match, $1, $2, $3, $4, $5, $6, $7, $8, offset, original){
  if (typeof $1 != 'undefined') return $1;
  if (typeof $5 != 'undefined') return $5;
  if (typeof $6 != 'undefined') return $6;
  if (typeof $7 != 'undefined') return $7;
  return '';
}

यह उद्धृत स्ट्रिंग टेक्स्ट और रेगेक्स शाब्दिक बरकरार में पाया गया कुछ भी प्राप्त करता है लेकिन सभी टिप्पणी कैप्चर के लिए एक खाली स्ट्रिंग देता है।

मुझे पता है कि यह अत्यधिक और बनाए रखना मुश्किल है लेकिन यह अब तक मेरे लिए काम करता प्रतीत होता है।


ब्लॉक टिप्पणी के लिए: https://regex101.com/r/aepSSj/1

स्लैश कैरेक्टर ( \1 ) से मेल खाता है जब स्लैश कैरेक्टर तारांकन के बाद होता है।

(\/)(?=\*)

शायद एक और तारांकन के बाद

(?:\*)

मैच के पहले समूह के बाद, या किसी चीज़ से शून्य या अधिक बार ... शायद, मैच को याद किए बिना, लेकिन समूह के रूप में कैप्चर करें।

((?:\1|[\s\S])*?)

इसके बाद तारांकन और पहले समूह

(?:\*)\1

ब्लॉक और / या इनलाइन टिप्पणी के लिए: https://regex101.com/r/aepSSj/2

कहां | मतलब या (?=\/\/(.*)) किसी भी // बाद कुछ भी कब्जा

या तीसरे भाग को कैप्चर करने के लिए https://regex101.com/r/aepSSj/3 भी

सभी में: https://regex101.com/r/aepSSj/8


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

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

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


यदि आपके समूह के साथ regexp है:

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

मिलान समूहों को खोजने के लिए आप स्ट्रिंग विधि के स्कैन का उपयोग करते हैं:

str.scan re
#> [["54"], ["1"], ["3"]]

मिलान पैटर्न खोजने के लिए:

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]




javascript regex comments replace