如何将此正则表达式拆分为更具可读性?

时间:2017-04-11 22:22:59

标签: javascript regex

仍然保留在对象文字中:

url:       /:\/{0,3}(www\.)?([0-9.\-A-Za-z]{1,253})([\x00-\x7F]{1,2000})$/,

此外,我如何简化它。

目前的状态只是一团糟。我现在不担心准确性。

以下是我在Crockford的书中的尝试:

makeRegex: function () {
    var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})
                    ([0-9.\-A-Za-z]+)
                    (?::(\d+))
                    ?(?:\/([^?#]*))
                    ?(?:\?([^#]*))
                    ?(?:#(.*))?$/; 
},

2 个答案:

答案 0 :(得分:0)

正则表达式众所周知是不可读的。他们不喜欢额外的空格,也没有评论。您唯一可行的解​​决方案是构造一个字符串,然后将其转换为正则表达式。

以下是我走过的步骤

目标正则表达式

var regex=/:\/{0,3}(www\.)?([0-9.\-A-Za-z]{1,253})([\x00-\x7F]{1,2000})$/;

使用RegExp从字符串构造表达式。

var parse_url = RegExp(':/{0,3}(www\\.)?([0-9.\\-A-Za-z]{1,253})([\\x00-\\x7F]{1,2000})$');

记住:

  • 表达式开头和结尾的/分隔符不在那里 - 它们只在RegEx文字中
  • 字符串中的\个字符加倍,因为字符串有自己的解释

通过添加'+'作为战略要点来打破字符串:

var parse_url = RegExp(':/{0,3}(www\\.)?'+'([0-9.\\-A-Za-z]{1,253})'+'([\\x00-\\x7F]{1,2000})$');

var parse_url = RegExp(':/{0,3}(www\\.)?'+
    '([0-9.\\-A-Za-z]{1,253})'+
    '([\\x00-\\x7F]{1,2000})$');

这不是一个非常好的解决方案,但是你可以用正则表达式做到这一点。

现代JavaScript确实以模板文字的形式支持多行字符串,但这可能对此没什么帮助。

答案 1 :(得分:0)

我建议将正则表达式分成几部分,并将每个部分分配给一个命名良好的变量,必要时添加注释。一个示例,旨在演示原则而不是正确验证URL,因为URL匹配正则表达式很难编写(https://mathiasbynens.be/demo/url-regex):

var protocol = '(?:https?|ftp)'; // Protocol can be "http", "https" or "ftp"
var domain = '([A-Za-z0-9\.]+)'; // Alphanumeric characters separated by periods
var path = '(?:[A-Za-z0-9\.\/]+)'; // Alphanumeric characters, . or /
var regexp = Regexp(protocol + '://' + domain + '/' + path);

现在你将正则表达式分解为更小,更容易理解的迷你表达式,整体表达式更容易阅读。