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
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:
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:
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
AabinGunz
Versuche dies,
(/*[w'srn*]**/)|(//[ws']*)|(<![--sw>/]*>)
sollte arbeiten 🙂
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
wolffer-ost
Ich habe einen Ausdruck zusammengestellt, der etwas Ähnliches tun muss.
das fertige produkt ist:
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
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
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.
„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
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.
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!*/;
undm = ///.test("notacomment!")
undvar re = //*/; // */ thiscommentishandledasascode!
undvar 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 herauszufinden9 /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