JavaScript で長い正規表現を複数行に分割するにはどうすればよいでしょうか? 質問する

JavaScript で長い正規表現を複数行に分割するにはどうすればよいでしょうか? 質問する

非常に長い正規表現があり、JavaScript コード内でこれを複数行に分割して、JSLint ルールに従って各行の長さを 80 文字に抑えたいと思っています。その方が読みやすいと思います。パターンのサンプルは次のとおりです。

var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

ベストアンサー1

source@KooiInc の回答を拡張すると、オブジェクトのプロパティを使用することで、すべての特殊文字を手動でエスケープする必要がなくなりますRegExp

例:

var urlRegex = new RegExp(
  /(?:(?:(https?|ftp):)?\/\/)/.source       // protocol
  + /(?:([^:\n\r]+):([^@\n\r]+)@)?/.source  // user:pass
  + /(?:(?:www.)?([^/\n\r]+))/.source       // domain
  + /(\/[^?\n\r]+)?/.source                 // request
  + /(\?[^#\n\r]*)?/.source                 // query
  + /(#?[^\n\r]*)?/.source                  // anchor
);

または、プロパティの繰り返しを避けたい場合は、次の関数.sourceを使用できますArray.map()

var urlRegex = new RegExp([
  /(?:(?:(https?|ftp):)?\/\/)/,     // protocol
  /(?:([^:\n\r]+):([^@\n\r]+)@)?/,  // user:pass
  /(?:(?:www.)?([^/\n\r]+))/,       // domain
  /(\/[^?\n\r]+)?/,                 // request
  /(\?[^#\n\r]*)?/,                 // query
  /(#?[^\n\r]*)?/,                  // anchor
].map(function (r) { return r.source; }).join(''));

ES6 では、 map 関数は次のように短縮できます.map(r => r.source)

おすすめ記事