我正在尝试使用Javascript RegEx命令将这些输入转换为以下输出:
INPUT DESIRED OUTPUT
mydomain.com --> mydomain.com
foo.mydomain.com --> mydomain.com
dev.mydomain.com --> dev.mydomain.com
dev-foo.mydomain.com --> dev.mydomain.com
以下是规则:
我的正则表达能力让我失望。这就是我到目前为止所做的:
'mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3');
// .mydomain.com
'foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3');
// foo.mydomain.com
'dev-foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3');
// dev.mydomain.com
'dev.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3');
// dev.mydomain.com
前两个失败,后两个失败。有什么建议吗?
这是有效的javascript,但我希望将它组合成一个正则表达式替换命令。请注意,我还想保留在dmain末尾指定的任何端口。
var getHost = function () {
var host = window.location.host;
if (host.substring(0,3) === 'dev') {
return host.replace(/^(dev)?(-.*)?(mydomain\.com.*)/,'$1.$3');
}
else {
return 'mydomain.com';
}
}
答案 0 :(得分:5)
只是为了表明可以在一个正则表达式中进行:
'string'.replace(/(?:(^dev).*(\.)|^.*)(mydomain\.com)/, '$1$2$3');
工作示例:http://jsfiddle.net/gz2tX/
以下是细分:它匹配dev
某些内容 .
,或者匹配任何内容。如果它与包含“dev”的模式匹配,$1
将包含“dev”,$2
将包含“。”。如果它与包含“dev”的模式不匹配,则$1
和$2
将为空。 ($3
在任何一种情况下都包含“mydomain.com”。)
所以这是可能的,但这是令人费解的。
我的建议是做一些比这更具可读性和可维护性的东西。在我看来,花费时间和精力来计算这一行并不值得保留一两行代码长度。
答案 1 :(得分:2)
您可以使用函数在替换中使用JS中的更多控件来修改值。
var value = "dev-foo.mydomain.com".replace(/^(dev)?[^\.]+\./, function (match, p1) {
return p1 ? p1 + '.' : '';
});
答案 2 :(得分:1)
很难说出你要求的东西......
但是......根据您的样本输入/输出,您可以执行以下操作:
如果
function trimInput(s) {
var n = s.indexOf('.');
if (n === -1) {
return s;
}
var head = s.substring(0, n);
if (head.indexOf("dev") !== -1) {
return "dev." + s.substring(n);
}
else {
return s.substring(n);
}
}
如果您想要 NOT ,请更新您的问题以指定您想要的内容。