仍然保留在对象文字中:
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+))
?(?:\/([^?#]*))
?(?:\?([^#]*))
?(?:#(.*))?$/;
},
答案 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);
现在你将正则表达式分解为更小,更容易理解的迷你表达式,整体表达式更容易阅读。