为了账号安全,请及时绑定邮箱和手机立即绑定

如何在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,}))$/;


查看完整描述

3 回答

?
慕娘9325324

您可以将其转换为字符串并通过调用创建表达式new RegExp():


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

笔记:


将表达式文字转换为字符串时,您需要对所有反斜杠进行转义,因为在评估字符串文字时会消耗反斜杠。(有关更多详细信息,请参见Kayo的评论。)

RegExp 接受修饰符作为第二个参数


/regex/g => new RegExp('regex', 'g')


[ 添加ES20xx(标记模板)]


在ES20xx中,您可以使用标记的模板。请参阅摘要。


注意:


这里缺点是,你不能在正则表达式字符串使用纯空格(经常使用\s,\s+,\s{1,x},\t,\n等)。

(() => {

  const createRegExp = (str, opts) => 

    new RegExp(str.raw[0].replace(/\s/gm, ""), opts || "");

  const yourRE = createRegExp`

    ^(([^<>()[\]\\.,;:\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,}))$`;

  console.log(yourRE);

  const anotherLongRE = createRegExp`

    (\byyyy\b)|(\bm\b)|(\bd\b)|(\bh\b)|(\bmi\b)|(\bs\b)|(\bms\b)|

    (\bwd\b)|(\bmm\b)|(\bdd\b)|(\bhh\b)|(\bMI\b)|(\bS\b)|(\bMS\b)|

    (\bM\b)|(\bMM\b)|(\bdow\b)|(\bDOW\b)

    ${"gi"}`;

  console.log(anotherLongRE);

})();


查看完整回答
反对 回复 2019-12-26
?
沧海一幻觉

扩展@KooiInc答案,您可以避免使用对象的source属性手动转义每个特殊字符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(r => r.source)


查看完整回答
反对 回复 2019-12-26
?
芜湖不芜

在中使用字符串new RegExp很麻烦,因为您必须转义所有反斜杠。您可以编写较小的正则表达式并将其连接起来。


让我们拆分此正则表达式


/^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$/

]);

由于这是有成本的,因此请尝试只构建一次真正的正则表达式,然后再使用它。


查看完整回答
反对 回复 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信