如何在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('')); 

注意:

  1. 当将expression式文字转换为string时,您需要转义所有反斜杠,因为在计算string文字时消耗了反斜杠。 (请参阅Kayo的更多细节的评论。)
  2. 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/