RegEx zum Abgleichen/Ersetzen von JavaScript-Kommentaren (sowohl mehrzeilig als auch inline)

Lesezeit: 9 Minuten

RegEx zum AbgleichenErsetzen von JavaScript Kommentaren sowohl mehrzeilig als auch inline
Metakraft

Ich muss alle JavaScript-Kommentare aus einer JavaScript-Quelle mithilfe des JavaScript-RegExp-Objekts entfernen.

Was ich brauche, ist das Muster für die RegExp.

Bisher habe ich das gefunden:

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

Dieses Muster funktioniert gut für:

/* I'm a comment */

oder für:

/*
 * I'm a comment aswell
*/

Aber scheint nicht für die Inline zu funktionieren:

// I'm an inline comment

Ich bin kein Experte für RegEx und seine Muster, also brauche ich Hilfe.

Außerdem hätte ich gerne ein RegEx-Muster, das all diese HTML-ähnlichen Kommentare entfernen würde.

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

Und auch diese bedingten HTML-Kommentare, die in verschiedenen JavaScript-Quellen zu finden sind.

Danke.

  • Verwandte Frage: Regulärer Ausdruck für saubere Javascript-Kommentare vom Typ //

    – Gumbo

    13. Mai ’11 um 8:55 Uhr


  • Das ist schwierig, da Sie haben können var str = "/* comment? */" und dergleichen, was Sie dazu bringen würde, JS auf irgendeine Weise zu analysieren, um es richtig zu machen.

    – Qsteuer

    13. Mai 11 um 8:57 Uhr

  • @Qtax – Es ist sogar noch kniffliger! Eine korrekte Lösung muss wörtliche reguläre Ausdrücke sowie Zeichenfolgen und Kommentare berücksichtigen. Folgendes berücksichtigen: var re = //*notacomment!*/; und m = ///.test("notacomment!") und var re = //*/; // */ thiscommentishandledasascode! und var re = /"/; // " thiscommentishandledasascode!

    – Gratläufer

    14. August 13 um 13:54 Uhr


  • @ridgerunner, das war mein Punkt, dass Sie JS “parsen” (tokenisieren) müssen. Das Abgleichen von Regex-Literalen ist nur geringfügig komplizierter als das Abgleichen von Zeichenfolgen oder Kommentaren. Nicht wegen Fluchten, sondern wegen des Fehlens von ihnen. Beispielsweise /[///]/. Aber Sie brauchen wahrscheinlich fast einen vollständigen Lexer, um das herauszufinden 9 /thisIsNotARegex/ 2.

    – Qsteuer

    14. August 13 um 20:39 Uhr

  • Beantwortet das deine Frage? Entfernen Sie HTML-Kommentare mit Regex in Javascript

    – justFatLard

    31. Oktober 20 um 1:10 Uhr

RegEx zum AbgleichenErsetzen von JavaScript Kommentaren sowohl mehrzeilig als auch inline
Ryan Wale

HINWEIS: Regex ist kein Lexer oder Parser. Wenn Sie einen seltsamen Grenzfall haben, in dem Sie einige seltsam verschachtelte Kommentare benötigen, die aus einer Zeichenfolge geparst werden müssen, verwenden Sie einen Parser. Für die anderen 98 % der Zeit sollte diese Regex funktionieren.

Ich hatte ziemlich komplexe Blockkommentare mit verschachtelten Sternchen, Schrägstrichen usw. Der reguläre Ausdruck auf der folgenden Seite funktionierte wie ein Zauber:

http://upshots.org/javascript/javascript-regexp-to-remove-comments


(Original siehe unten)

Es wurden einige Änderungen vorgenommen, aber die Integrität der ursprünglichen Regex wurde beibehalten. Um bestimmte doppelte Schrägstriche (//) Sequenzen (z. B. URLs), Sie müssen Rückverweise verwenden $1 in Ihrem Ersatzwert anstelle einer leeren Zeichenfolge. Hier ist es:

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

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

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

DEMO: https://regex101.com/r/B8WkuX/1

FEHLENDE ANWENDUNGSFÄLLE: Es gibt einige Grenzfälle, in denen diese Regex fehlschlägt. Eine fortlaufende Liste dieser Fälle ist in dokumentiert diese öffentliche Kernaussage

. Bitte aktualisieren Sie den Kern, wenn Sie andere Fälle finden.

…Und wenn Du Auch entfernen möchten <!-- html comments --> benutze das:

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

(Original – nur als historische Referenz)

// DO NOT USE THIS - SEE ABOVE
/(/*([sS]*?)*/)|(//(.*)$)/gm

  • (?:/*(?:[sS]*?)*/)|(?:^s*//(?:.*)$) sollte besser sein, da es nicht behandeln würde // in der Mitte des Strings, zum Beispiel in URLs

    – Eugen Nagorny

    18. Juni 13 um 12:36 Uhr

  • @Ideviantik – Danke! Ich habe meine Antwort aktualisiert. Hoffentlich entwickelt sich dies weiter, da Ihre Lösung so etwas überspringen würde: var foo = "bar";// This is a comment – also habe ich dort ein optionales Semikolon hinzugefügt.

    – Ryan Wheale

    18. Juni 13 um 22:33 Uhr

  • Scheint daran zu scheitern: var foo = "everything /* in this string */ should be kept"

    – DG.

    25. Oktober 13 um 13:01 Uhr

  • @DG – Fühlen Sie sich frei, sich einen Javascript-Parser zu schnappen und ihn für Ihr extremes Grenzfall-Szenario zu verwenden. Die obige Regex dient nicht zum Parsen, sondern zum Entfernen typischer Kommentare in einer Datei. Wenn ein Parser übertrieben ist, schlage ich vor, dass Sie entweder Ihre Schrägstriche (/) oder Sternchen (*) codieren oder die Verkettung verwenden: "everything /" + "* in this string *" + "/ should be kept"

    – Ryan Wheale

    25. Oktober 13 um 19:46 Uhr

  • @RyanWheale – Beruhige dich. Ich warne nur andere, sich dessen bewusst zu sein. Es scheitert auch an foo = "this //is.no.comment". Aber der größte Fehler ist, dass es “;” entfernen wird. von ab=a+b; // AB. Das Original nicht, aber es hat andere Mängel, wie vom ursprünglichen Autor anerkannt. Übrigens, Ihre vorgeschlagene Problemumgehung ist nur nützlich, wenn ich für den Code verantwortlich bin, der entfernt wird. Wenn das der Fall wäre, könnte ich mir alle möglichen Einschränkungen auferlegen und das Schreiben der Regex wäre trivial. Alles in allem habe ich keine perfekte Regex-Lösung gefunden. Es ist wahrscheinlich (praktisch) unmöglich.

    – DG.

    26. Oktober 13 um 1:02 Uhr


1643255708 382 RegEx zum AbgleichenErsetzen von JavaScript Kommentaren sowohl mehrzeilig als auch inline
AabinGunz

Versuche dies,

(/*[w'srn*]**/)|(//[ws']*)|(<![--sw>/]*>)

sollte arbeiten 🙂
Geben Sie hier die Bildbeschreibung ein

  • Wie wäre es mit "foo /* bar */ baz"?

    – Gumbo

    13. Mai 11 um 8:54 Uhr

  • Ihre Regex passt zu allen HTML-Tags und nicht nur zu den Kommentaren.

    – Stamm

    13. Mai 11 um 8:58 Uhr

  • Keine Lösung mit Regex dafür. Sie können nicht unterscheiden, ob //dies innerhalb des Codes (String) oder am Ende der Zeile erscheint (keine Möglichkeit, die Anzahl (gerade Anzahl) von Anführungszeichen zu zählen (“|’), also erst danach //Kommentar finden)

    – Nevena

    11. Juli 12 um 21:19 Uhr

  • Dies entspricht auch dem // in http://, also foo.com/foo_image.png” /> wird als Kommentar betrachtet! was NICHT ist!

    – Mojtaba

    1. April 13 um 18:23 Uhr

  • Verwenden Sie diese Regex nicht! es passt auch http:// und jede andere Regex, die hat // oder /*. Es ist also unbrauchbar

    – jonschlinkert

    9. August 13 um 1:45 Uhr

1643255709 998 RegEx zum AbgleichenErsetzen von JavaScript Kommentaren sowohl mehrzeilig als auch inline
wolffer-ost

Ich habe einen Ausdruck zusammengestellt, der etwas Ähnliches tun muss.
das fertige produkt ist:

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

Gruselig oder?

Um es aufzuschlüsseln, der erste Teil stimmt mit allem innerhalb einfacher oder doppelter Anführungszeichen überein
Dies ist notwendig, um übereinstimmende Zeichenfolgen in Anführungszeichen zu vermeiden

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

der zweite Teil entspricht mehrzeiligen Kommentaren, die durch /* */ getrennt sind

(/*(?:(?!*/).|[nr])**/)

Der dritte Teil gleicht einzeilige Kommentare ab, die irgendwo in der Zeile beginnen

(//[^nr]*(?:[nr]+|$))

Der vierte bis sechste Teil stimmt mit allem innerhalb eines Regex-Literals überein
Dies beruht auf einem vorangestellten Gleichheitszeichen oder dem Literal vor oder nach einem Regex-Aufruf

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

und der siebte, den ich ursprünglich vergessen habe, entfernt die HTML-Kommentare

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

Ich hatte ein Problem mit meiner Entwicklungsumgebung, die Fehler für eine Regex ausgab, die eine Zeile umbrach, also habe ich die folgende Lösung verwendet

var ADW_GLOBALS = new Object
ADW_GLOBALS = {
  quotations : /((["'])(?:(?:\\)|\2|(?!\2)\|(?!2).|[nr])*2)/,
  multiline_comment : /(/*(?:(?!*/).|[nr])**/)/,
  single_line_comment : /(//[^nr]*[nr]+)/,
  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 '';
}

Dies gibt alles zurück, was durch den Text der Zeichenfolge in Anführungszeichen erfasst wird, und alles, was in einem Regex-Literal gefunden wird, intakt, gibt jedoch eine leere Zeichenfolge für alle Kommentarerfassungen zurück.

Ich weiß, dass dies übertrieben und ziemlich schwierig zu pflegen ist, aber bisher scheint es für mich zu funktionieren.

  • Ich bekomme SyntaxError: unterminated parenthetical im Firefox.

    – DG.

    25. Oktober 13 um 13:03 Uhr

  • Ich habe einige Änderungen vorgenommen und eine js-Geige hochgeworfen, um das Kopieren zu erleichtern. Verknüpfung Hoffentlich hilft das. Bitte beachten Sie, dass dies mit Skripten und den meisten anderen Codes funktioniert, aber wenn Sie freien Text mit Klammern erhalten, werden Sie Probleme bekommen. Der Code weiß nicht, wie er mit dem ‘in does’t umgehen soll, wenn es nicht selbst in Anführungszeichen steht

    – Wolffer-Ost

    1. November 13 um 20:58 Uhr


  • „weiß nicht damit umzugehen [a single quote if it doesn’t appear] in Anführungszeichen” – Das ist eine SEHR wichtige Tatsache, die es zu beachten gilt. Ehrlich gesagt macht es den Ausdruck für die meisten allgemeinen Zwecke unbrauchbar. Es ist sehr üblich, einfache Anführungszeichen anstelle von doppelten Anführungszeichen zu verwenden. Aber meine Tests zeigen viel schwerwiegendere Probleme mit dem Ausdruck .Der Testfall in Ihrer Geige ist sehr begrenzt.Ich habe einen weitaus umfangreicheren Testfall und der Ausdruck schlachtet ihn an vielen Stellen schlecht.IMHO ist es sinnlos zu versuchen und zu beheben.Meine Forschung zeigt stark, dass keine einzelne Regex das tun kann Arbeit angemessen.

    – DG.

    2. November 13 um 1:37 Uhr


  • Ich habe mir das ausgedacht, um speziell mit Javascript-Code umzugehen. Leider funktioniert es nicht mit allgemeinem Text, aber das liegt daran, dass es sich um einen völlig anderen Anwendungsfall handelt. Wie auch immer, könnten Sie Ihren umfangreicheren Testfall in eine Geige bringen und einen Link löschen? Es wäre sehr hilfreich für mich zu wissen, bei welchen Problemen dies brechen wird. Selbst wenn es niemand sonst verwendet, muss ich wissen, wo es für meinen eigenen Gebrauch kaputt geht.

    – Wolffer-Ost

    4. November 13 um 14:49 Uhr

  • Es funktioniert nicht. Transformiert: function(field) { // Kommentarbeispiel return new field(‘like’).equal(‘no’); } in “function (field) {return new field().equal();}” Alles zwischen Anführungszeichen wird entfernt.

    – Julien L

    2. Januar 14 um 22:23 Uhr

RegEx zum AbgleichenErsetzen von JavaScript Kommentaren sowohl mehrzeilig als auch inline
aMarCruz

Dies funktioniert für fast alle Fälle:

var RE_BLOCKS = new RegExp([
  //(*)[^*]**+(?:[^*/][^*]**+)*//.source,           // $1: multi-line comment
  //(/)[^n]*$/.source,                                 // $2 single-line comment
  /"(?:[^"\]*|\[Ss])*"|'(?:[^'\]*|\[Ss])*'/.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
  });
}

Der Code basiert auf Regexes von jspreproc, für die ich dieses Tool geschrieben habe Riot-Compiler.

Sehen http://github.com/aMarCruz/jspreproc

1643255709 114 RegEx zum AbgleichenErsetzen von JavaScript Kommentaren sowohl mehrzeilig als auch inline
Shobhit Sharma

In einfacher JS-Regex, dies:

my_string_or_obj.replace(//*[sS]*?*/|([^:]|^)//.*$/gm, ' ')

  • das hat funktioniert! obwohl es vielleicht durch ” ” (ein einzelnes Leerzeichen) anstelle von ” ersetzt wird

    Benutzer5047085

    1. November 18 um 19:40 Uhr

  • Danke! Ich habe mir ungefähr 10 verschiedene RegExes angesehen und diese war die einzige, die in jedem Szenario perfekt funktionierte!

    – Sv443

    1. Februar 19 um 15:35 Uhr

  • Unter Verwendung der gegebenen Regex gibt die folgende Antwort 3//. p = //*[sS]*?*/|([^:]|^)//.*$/gm;` x='3//'; x.match(p);

    – Himadhar H

    17. Juni 21 um 9:33 Uhr


1643255709 994 RegEx zum AbgleichenErsetzen von JavaScript Kommentaren sowohl mehrzeilig als auch inline
Aurielle Perlmann

etwas einfacher –

das funktioniert auch für mehrzeilig – (<!--.*?-->)|(<!--[wWns]+?-->)

Geben Sie hier die Bildbeschreibung ein

  • das hat funktioniert! obwohl es vielleicht durch ” ” (ein einzelnes Leerzeichen) anstelle von ” ersetzt wird

    Benutzer5047085

    1. November 18 um 19:40 Uhr

  • Danke! Ich habe mir ungefähr 10 verschiedene RegExes angesehen und diese war die einzige, die in jedem Szenario perfekt funktionierte!

    – Sv443

    1. Februar 19 um 15:35 Uhr

  • Unter Verwendung der gegebenen Regex gibt die folgende Antwort 3//. p = //*[sS]*?*/|([^:]|^)//.*$/gm;` x='3//'; x.match(p);

    – Himadhar H

    17. Juni 21 um 9:33 Uhr


1643255709 593 RegEx zum AbgleichenErsetzen von JavaScript Kommentaren sowohl mehrzeilig als auch inline
vantrung-cuncon

Einfache Regex NUR für Mehrzeilen:

/*((.|n)(?!/))+*/

.

655300cookie-checkRegEx zum Abgleichen/Ersetzen von JavaScript-Kommentaren (sowohl mehrzeilig als auch inline)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy