Javascript 正则表达式来匹配模式
我有一个要求Javascript 正则表达式来匹配模式,javascript,regex,Javascript,Regex,我有一个要求 .domain .domain.com .domain.com/path .domain.com:443/path domain.com domain.com/path domain.com:443/path domain /path :443/path 都应该是真的吗 然而 . ./path .:443 *.domain *.domain/path *.domain:443/path / :443 */path anything with ? in it 应该全部返回fals
.domain
.domain.com
.domain.com/path
.domain.com:443/path
domain.com
domain.com/path
domain.com:443/path
domain
/path
:443/path
都应该是真的吗
然而
.
./path
.:443
*.domain
*.domain/path
*.domain:443/path
/
:443
*/path
anything with ? in it
应该全部返回false
我在JS中提出了以下内容。但是,经过几次修改后,我完全迷路了
/^\.?[^:\/]([\da-z\.-]+)\.?([a-z\.]{2,6})?(:[0-9]+)?([\/\w \.-]*)*\/?$/
我的测试存根如下所示:
console.log(urlRegExp('*.domain/path'));
console.log(urlRegExp('*.domain:443/path'));
console.log(urlRegExp('/'));
console.log(urlRegExp(':443'));
console.log(urlRegExp('*/path'));
console.log(urlRegExp('domain.com?q=a'));
function urlRegExp(){
return /^\.?[^:\/]([\da-z\.-]+)\.?([a-z\.]{2,6})?(:[0-9]+)?([\/\w \.-]*)*\/?$/.test(arguments[0]) + " " + arguments[0];
}
我无法使用此模式处理列出的所有字符串。每当我更改某些内容以使其通过时,另一个字符串就会失败。我是一个初学者,刚刚开始通过烹饪书深入理解正则表达式。然而,这可能需要一段时间,我需要尽快完成。任何帮助或指导都会很棒
目前的结果:
应返回true:
true .domain
true .domain.com
true .domain.com/path
true .domain.com:443/path
true domain.com
true domain.com/path
true domain.com:443/path
true domain
false /path -- should be true
false :443/path -- should be true
如果返回false:
false .
false ./path
false .:443
true *.domain -- should be false
true *.domain/path -- should be false
true *.domain:443/path -- should be false
false /
false :443
false */path
false domain.com?q=a
也许是这样的
/^[./:a-z]([0-9]+\/)?[a-z]+[^?]*$/
在这里解释
/^ # Start regex, and start matching
[./:a-z] # starts with dot, slash, colon or a-z
([0-9]+\/)? # optionally has multi-digit number followed by slash
[a-z]+ # has one or more letters next
[^?]* # has zero or more characters that are not `?`
$/ # end of matching and end regex
很难知道你的具体目标是什么
测试在
咖啡脚本
在
Javascript
这是不可能的。例如:
true
规则.domain.com/path
中的第三个被false
规则*/path
中的第九个禁止(给出了*
的合理解释)。您认为*
对您的方案来说意味着什么?为什么存在这套特定的规则?你到底想验证什么?如何输入?去哪里?在什么情况下?测试似乎表明*
是一个普通的*
。它是?或者这意味着什么?练习似乎是测试集中的模式识别,而不是为它找到正则表达式。首先尝试找出规则。这是一个URL重定向表单。用户不应输入违反上述规则的URL模式。URL模式,而不仅仅是URL。所以,a*意味着一个字面意义上的*,非常有效。现在,我要反复学习,以了解其中的神奇之处我怎么处理最后两个domain.com?
和domain。?com
对不起,后两个现在处理正确。我在发布后更新了答案,但忘了更新console.log
输出。?
由[^?]
处理,这是一个否定字符集,表示除?
之外的任何内容。因此,整个字符串在开始时只匹配一组字符,除了?
之外的任何字符,直到字符串结束。我还应该提到,javascript是直接从coffee脚本编译的,如果手工编写的话,可以写得简单得多。我用\r\n
来覆盖任何情况-习惯的力量试图使我的正则表达式可移植-尽管我认为\n
只满足任何操作系统上的javascript。而且,它不是紧跟着\r
的\n
,而是\r
和\n
的字符集,我说的是任意数量的连续\r
或任意一种类型的'n都是我的定界符,所以即使是\r\n\r\n\n\n`也可以充当定界符。
rex = /^[./:a-z]([0-9]+\/)?[a-z]+[^?]*$/
for str in """
.domain
.domain.com
.domain.com/path
.domain.com:443/path
domain.com
domain.com/path
domain.com:443/path
domain
/path
:443/path
""".split /[\r\n]+/
console.log "Should be true - is #{if str.match rex then 'true ' else 'false'} #{str}"
for str in """
.
./path
.:443
*.domain
*.domain/path
*.domain:443/path
/
:443
*/path
domain.com?
domain.?com
?domain.com
""".split /[\r\n]+/
console.log "Should be false - is #{if str.match rex then 'true ' else 'false'} #{str}"
var rex, str, _i, _j, _len, _len1, _ref, _ref1;
rex = /^[./:a-z]([0-9]+\/)?[a-z]+[^?]*$/;
_ref = ".domain\n.domain.com\n.domain.com/path\n.domain.com:443/path\ndomain.com\ndomain.com/path\ndomain.com:443/path\ndomain\n/path\n:443/path".split(/[\r\n]+/);
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
str = _ref[_i];
console.log("Should be true - is " + (str.match(rex) ? 'true ' : 'false') + " " + str);
}
_ref1 = ".\n./path\n.:443\n*.domain\n*.domain/path\n*.domain:443/path\n/\n:443\n*/path\ndomain.com?\ndomain.?com\n?domain.com".split(/[\r\n]+/);
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
str = _ref1[_j];
console.log("Should be false - is " + (str.match(rex) ? 'true ' : 'false') + " " + str);
}
Should be true - is true .domain
Should be true - is true .domain.com
Should be true - is true .domain.com/path
Should be true - is true .domain.com:443/path
Should be true - is true domain.com
Should be true - is true domain.com/path
Should be true - is true domain.com:443/path
Should be true - is true domain
Should be true - is true /path
Should be true - is true :443/path
Should be false - is false .
Should be false - is false ./path
Should be false - is false .:443
Should be false - is false *.domain
Should be false - is false *.domain/path
Should be false - is false *.domain:443/path
Should be false - is false /
Should be false - is false :443
Should be false - is false */path
Should be false - is false domain.com?
Should be false - is false domain.?com
Should be false - is false ?domain.com