この記事では、js 正規表現の最長一致 (貪欲一致) と最短一致 (遅延一致) の使用法を例を通して分析します。参考までに皆さんと共有してください。詳細は次のとおりです:
最近、RequireJS 2.1.15 ソース コードを読んでいると、ソース コードの先頭に一連の変数が定義されており、正規表現が 4 つあります:
var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg, cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, jsSuffixRegExp = /\.js$/, currDirRegExp = /^\.\//;
commentRegExp正規表現は JavaScript コードと一致するために使用されます。 注: /m の使用法については、次の記事を参照してください。 JS 正規表現修飾子における複数行 (/m) の使用法分析 /g の使用法については、次の記事を参照してください。 JS正規表現修飾子グローバル(/g)の使用状況分析。 commentRegExp で *? を使用するのは初めてで、正規表現では * が 0 以上を表し、? が 0 または 1 を表すので、非常に奇妙だと思います。冗長でした。同僚に聞いてみると、 *? この書き方は遅延マッチングです。
alert(/abc([\w]*)/mg.exec("abc1abc2")[0]);//abc1abc2 alert(/abc([\w]*?)/mg.exec("abc1abc2")[0]);//abc
それは、次のコードを通して見ることができます: 最長一致と最短一致の違いは、このコードを通して見ることができます: 最長一致と最短一致の違いは、できるだけ多くの文字に一致し、その他は、可能な限り少ない文字に一致します。一般に、正規表現エンジンはデフォルトで最長一致を使用します。最短一致が必要な場合は、数量修飾子の後に ? を追加すると最短一致になります。
/***注释1****/ var name = "aty"; /***注释2****/ var name = "aty";
上記のコードから、requirejs が JavaScript コメントを照合するときに *? の最短照合モードを使用する理由がわかります。すべてのコメントを削除したい場合は、最も短い一致を使用する必要があります。そうでない場合は、var name="aty"; コードが置き換えられます。
その他の js 正規表現の最長一致 (貪欲一致) および最短一致 (遅延一致) の使用分析関連記事については、PHP 中国語 Web サイトに注目してください。