非常に長い正規表現があり、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)
。