如何在JavaScript中将长正则expression式分成多行?
我有一个非常长的正则expression式,我希望在我的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,}))$/;
您可以将其转换为string,并通过调用new RegExp()
创buildexpression式:
var myRE = new RegExp (['^(([^<>()[\]\\.,;:\\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,}))$'].join(''));
注意:
- 当将expression式文字转换为string时,您需要转义所有反斜杠,因为在计算string文字时消耗了反斜杠。 (请参阅Kayo的更多细节的评论。)
-
RegExp
接受修饰符作为第二个参数/regex/g
=>new RegExp('regex', 'g')
扩展@KooiInc答案,你可以避免使用RegExp
对象的source
属性手动转义每个特殊字符。
例:
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(r => r.source)
在new RegExp
使用string是尴尬的,因为你必须逃避所有的反斜杠。 你可以编写更小的正则expression式并连接它们。
让我们拆分这个正则expression式
/^foo(.*)\bar$/
稍后我们将使用一个函数使事情更美丽
function multilineRegExp(regs, options) { return new RegExp(regs.map( function(reg){ return reg.source; } ).join(''), options); }
现在让我们摇滚
var r = multilineRegExp([ /^foo/, // we can add comments too /(.*)/, /\bar$/ ]);
由于它有成本,试着build立一个真正的正则expression式然后使用它。
上面的正则expression式缺less一些黑色的斜杠,这是不正确的。 所以,我编辑了正则expression式。 请考虑这99.99%的电子邮件validation的正则expression式。
let EMAIL_REGEXP = new RegExp (['^(([^<>()[\\]\\\.,;:\\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,}))$'].join(''));
就个人而言,我会去一个不太复杂的正则expression式:
/\S+@\S+\.\S+/
当然,它不如你现在的模式准确 ,但你想完成什么? 您是否试图抓住用户可能input的意外错误,或者是否担心用户可能会尝试input无效地址? 如果它是第一个,我会去一个更简单的模式。 如果是后者,通过回复发送到该地址的电子邮件进行validation可能是更好的select。
但是,如果您想使用当前的模式,通过从较小的子模式构build它,(IMO)会更容易阅读(并保持!),如下所示:
var box1 = "([^<>()[\]\\\\.,;:\s@\"]+(\\.[^<>()[\\]\\\\.,;:\s@\"]+)*)"; var box2 = "(\".+\")"; var host1 = "(\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])"; var host2 = "(([a-zA-Z\-0-9]+\\.)+[a-zA-Z]{2,})"; var regex = new RexExp("^(" + box1 + "|" + box2 + ")@(" + host1 + "|" + host2 + ")$");
通过ES 2015,可以使用模板文字干净地完成它: https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals
console.log(`string text line 1 string text line 2`);
模板标签将帮助删除空白。 这是一个删除空格的模板标签: https : //muffinresearch.co.uk/removing-leading-whitespace-in-es6-template-strings/