質問: やりたいこと: 1233文字の長い正規表現のメンテナンス性を上げたい。 初めましての方は初めまして、お久しぶりの方はお久しぶりです。3年ぶりに帰ってきました。 現在、javascriptでスタイルシートを解析するツールを書いてます。埋め込みフォントのURLを解析する正規表現を書いたのですが... ``` /^(?:local\([\t\n\f\r ]*(?:(["'])(?:(?!\1)[^\n\f\r\\]|\\(?:[\n\f]|\r\n?)|(?:(?:\\[\dA-F]{1,6}(?:[\t\n\f ]|\r\n?)?)|\\[^\n\f\r\dA-F]))*\1|-?(?:[_A-Z\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF]|\\(?:[\dA-F]{1,6}(?:[\t\n\f ]|\r\n?)?|(?:[\x20-\x7E\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF])))(?:[-\w\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF]|\\(?:[\dA-F]{1,6}(?:[\t\n\f ]|\r\n?)?|(?:[\x20-\x7E\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF])))*(?:[\t\n\f\r ]+-?(?:[_A-Z\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF]|\\(?:[\dA-F]{1,6}(?:[\t\n\f ]|\r\n?)?|(?:[\x20-\x7E\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF])))(?:[-\w\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF]|\\(?:[\dA-F]{1,6}(?:[\t\n\f ]|\r\n?)?|(?:[\x20-\x7E\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF])))*)*)[\t\n\f\r ]*\)[\t\n\f\r ]*,[\t\n\f\r ]*)*url\([\t\n\f\r ]*((["'])(?:(?!\3)[^\n\f\r\\]|\\(?:[\n\f]|\r\n?)|(?:(?:\\[\dA-F]{1,6}(?:[\t\n\f ]|\r\n?)?)|\\[^\n\f\r\dA-F]))*\3|(?:[\t!#-&\x2A-\x7E]|[\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF]|\\[\dA-F]{1,6}(?:[\t\n\f ]|\r\n?)?|\\(?:[\x20-\x7E\x80-\uD7FF\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF]))*)[\t\n\f\r ]*\)/i ``` ...(バグは除去できましたが)長くなりすぎてメンテナンスに困っています。 知りたい内容は、 1. 正規表現を途中で改行できるか? 2. 同じ内容を省略して書く方法はないか? 3. ライブラリを使うなら、何を使うべきか? リテラルとの速度差は? 4. グローバルスコープを汚染せず、事前にnew RegExpで正規表現オブジェクトを生成できるか? (可能であれば外部からの干渉を不可能にしたい。) という内容です。Googleで検索したのですが、まとまった情報がなくて今後の方針に悩んでいます。1-4のどの観点からのアドバイスでも力になるので、ご意見よろしくお願いします。
回答: 「正規表現 可視化」などで探すと図にしてくれるツールがいくつか見つかると思うので、編集の際には利用するのがおすすめです。 https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24 図の中で独立性が高かったり、繰り返し現れるパターンを見つけやすくなるので、 他の方も言っているように、あとは文字列として切り出してjoinするのが良いと思います。