In diesem Artikel wird die Verwendung des längsten Matchings (Greedy Matching) und des kürzesten Matchings (Lazy Matching) von regulären js-Ausdrücken analysiert. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
Ich habe kürzlich den Quellcode von RequireJS 2.1.15 gelesen. Am Anfang des Quellcodes sind eine Reihe von Variablen definiert, und es gibt 4 Reguläre Ausdrücke:
var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg, cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, jsSuffixRegExp = /\.js$/, currDirRegExp = /^\.\//;
Der reguläre Ausdruck „commentRegExp“ wird zum Abgleichen von Kommentaren im JavaScript-Code verwendet. Informationen zur Verwendung von /m finden Sie in diesem Artikel: Verwendungsanalyse von Multiline (/m) im JS-Modifikator für reguläre Ausdrücke Informationen zur Verwendung von /g finden Sie in diesem Artikel: JS-Regulärausdruck. Ich habe diese Verwendung von *? in commentRegExp noch nie gesehen und finde es sehr seltsam, da * in regulären Ausdrücken 0 oder mehr darstellt und ? 0 oder 1 darstellt. Zuerst dachte ich, diese Schreibweise *? war überflüssig. Ich habe meine Kollegen gebeten, das herauszufinden *? Diese Schreibweise ist Lazy Matching.
alert(/abc([\w]*)/mg.exec("abc1abc2")[0]);//abc1abc2 alert(/abc([\w]*?)/mg.exec("abc1abc2")[0]);//abc
Es kann durch den folgenden Code gesehen werden: Der Unterschied zwischen der längsten Übereinstimmung und der kürzesten Übereinstimmung kann durch diesen Code gesehen werden: Der Unterschied zwischen der längsten Übereinstimmung und der kürzesten Übereinstimmung, man stimmt mit so vielen überein Zeichen wie möglich, eines, das mit möglichst wenigen Zeichen übereinstimmt. Im Allgemeinen verwenden Engines für reguläre Ausdrücke standardmäßig die längste Übereinstimmung. Wenn wir die kürzeste Übereinstimmung wünschen, können wir nach dem Mengenmodifikator ein ? hinzufügen, um die kürzeste Übereinstimmung zu erhalten.
/***注释1****/ var name = "aty"; /***注释2****/ var name = "aty";
Aus dem obigen Code können wir erkennen, warum requirejs beim Abgleichen von Javascript-Kommentaren den kürzesten Matching-Modus *? verwendet. Wenn wir alle Kommentare löschen möchten, sollte die kürzeste Übereinstimmung verwendet werden, andernfalls wird der var name="aty"-Code ersetzt.
Weitere Artikel zur Analyse der Verwendung von regulären js-Ausdrücken mit der längsten Übereinstimmung (Greedy Matching) und der kürzesten Übereinstimmung (Lazy Matching) finden Sie auf der chinesischen PHP-Website!