質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

1005閲覧

正規表現を分かりやすく書くには

majiponi

総合スコア1720

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

2クリップ

投稿2019/04/14 15:40

やりたいこと: 1233文字の長い正規表現のメンテナンス性を上げたい。

初めましての方は初めまして、お久しぶりの方はお久しぶりです。3年ぶりに帰ってきました。
現在、javascriptでスタイルシートを解析するツールを書いてます。埋め込みフォントのURLを解析する正規表現を書いたのですが…

Javascript

1/^(?: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 2```(バグは除去できましたが)長くなりすぎてメンテナンスに困っています。 3知りたい内容は、 4 51. 正規表現を途中で改行できるか? 62. 同じ内容を省略して書く方法はないか? 73. ライブラリを使うなら、何を使うべきか? リテラルとの速度差は? 84. グローバルスコープを汚染せず、事前にnew RegExpで正規表現オブジェクトを生成できるか? (可能であれば外部からの干渉を不可能にしたい。) 9 10という内容です。Googleで検索したのですが、まとまった情報がなくて今後の方針に悩んでいます。1-4のどの観点からのアドバイスでも力になるので、ご意見よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

回答

A1, A2. 現行の正規表現リテラルでは、改行出来ませんし、正規表現を変数化して参照する機構はありません。
一般解としては、文字列リテラルで変数に格納してから、連結演算子もしくは、Array#joinで連結し、new RegExp に渡すことになります。

A4. 変数宣言を関数コード内で行うか、let, const のブロックスコープを使用して下さい。

参考例

過去に作成した rfc3986.js が参考になりそうなので、紹介しておきます。
https://gist.github.com/think49/770087

これは RFC3986 のABNF書式をそのまま正規表現に変換したものですが、正規表現が自己流なら、別途、文法規則を文書化すると良いかもしれません。
https://triple-underscore.github.io/RFC3986-ja.html

Re: majiponi さん

投稿2019/04/14 23:08

編集2019/04/15 03:33
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

javascript

1function newReg () { 2 let 3 a = '', 4 b = '', 5 c = '', 6 d = a + b + c + b + a; 7 8 return new RegExp (d); 9} 10 11const REG = newReg (); 12

投稿2019/04/14 20:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

「正規表現 可視化」などで探すと図にしてくれるツールがいくつか見つかると思うので、編集の際には利用するのがおすすめです。
https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24

図の中で独立性が高かったり、繰り返し現れるパターンを見つけやすくなるので、
他の方も言っているように、あとは文字列として切り出してjoinするのが良いと思います。

投稿2019/04/15 03:05

otolab

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

majiponi

2019/04/18 14:07

皆さん回答ありがとうございます。可視化ツールでバグ修正とチューニングができたので、otolabさんをBAにさせていただきます。 結論としては、2つの命令に分割して、関数冒頭にツールのURLと要約をコメントすることでメンテナンス性を確保し、正規表現を出力するためのプログラムを別で用意することにします。
guest

0

改行を改行として判断していいなら改行はできますけど・・・
(今回はそうではなさそうな感じですけどね)

javascript

1var str="a\n123\nb"; 2var pattern=`a 3\d+ 4b`; 5var reg=new RegExp(pattern,'m'); 6console.log(str.match(reg));

投稿2019/04/15 00:31

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問